Django 反向关系与递归 M2M 关系
Django Reverse relationship with Recursive M2M Relationship
尝试从此处的文档进行扩展:https://docs.djangoproject.com/en/1.10/topics/db/models/#extra-fields-on-many-to-many-relationships
上下文更容易理解,Person 对象,M2M 与自身的关系定义了两个 Person 之间的 'relationship types',例如 Parent/Child/Engaged
我的Models.py:
RELATIONSHIPS = (
(0, 'Child'),
(1, 'Parent'),
(2, 'Engaged'),
)
class Person(models.Model):
code = models.AutoField(primary_key=True, verbose_name="Person Code")
name = models.CharField(max_length=150, blank=True, null=True, verbose_name="Name")
relationships = models.ManyToManyField(
'self',
through = 'Person_Person', #This lets you define the model that will act as an intermadiary
symmetrical = False, #This needs to be set with recursive relationships
)
class Person_Person(models.Model):
person_1 = models.ForeignKey('Person', on_delete=models.CASCADE,
related_name='%(class)s_person_1', verbose_name="Person 1")
person_2 = models.ForeignKey('Person', on_delete=models.CASCADE,
related_name='%(class)s_person_2', verbose_name="Person 2")
relationship_type = models.IntegerField(choices = RELATIONSHIPS, default = 5, verbose_name="Relation")
测试代码:
p1 = Person.objects.create(name = 'Man')
p2 = Person.objects.create(name = 'Woman')
relation = Person_Person(person_1 = p1, person_2 = p2, relationship_type = 2)
reation.save()
print(p1.relationships.all(), p2.relationships.all())
#>><QuerySet [<Person: 108 Woman>]>
#>><QuerySet []>
现在的问题是,p2
的关系字段查询集返回空,我理解为什么当你考虑非递归关系时,但在这种情况下调用 p2.relationships_set
没有从某种意义上说,即使有,我怎么知道 Person
是关系的 person_1
还是 person_2
?
欢迎任何建议
这似乎是
How to make recursive ManyToManyField relationships that have extra fields symmetrical in Django?
但我不能标记它们
基本上这在 django 中是不可能的,因为你必须定义 symmetrical=False
。
您可以选择以相反的方式添加第二个 m2m
字段。另一个线程对此有一些很好的读物
尝试从此处的文档进行扩展:https://docs.djangoproject.com/en/1.10/topics/db/models/#extra-fields-on-many-to-many-relationships
上下文更容易理解,Person 对象,M2M 与自身的关系定义了两个 Person 之间的 'relationship types',例如 Parent/Child/Engaged
我的Models.py:
RELATIONSHIPS = (
(0, 'Child'),
(1, 'Parent'),
(2, 'Engaged'),
)
class Person(models.Model):
code = models.AutoField(primary_key=True, verbose_name="Person Code")
name = models.CharField(max_length=150, blank=True, null=True, verbose_name="Name")
relationships = models.ManyToManyField(
'self',
through = 'Person_Person', #This lets you define the model that will act as an intermadiary
symmetrical = False, #This needs to be set with recursive relationships
)
class Person_Person(models.Model):
person_1 = models.ForeignKey('Person', on_delete=models.CASCADE,
related_name='%(class)s_person_1', verbose_name="Person 1")
person_2 = models.ForeignKey('Person', on_delete=models.CASCADE,
related_name='%(class)s_person_2', verbose_name="Person 2")
relationship_type = models.IntegerField(choices = RELATIONSHIPS, default = 5, verbose_name="Relation")
测试代码:
p1 = Person.objects.create(name = 'Man')
p2 = Person.objects.create(name = 'Woman')
relation = Person_Person(person_1 = p1, person_2 = p2, relationship_type = 2)
reation.save()
print(p1.relationships.all(), p2.relationships.all())
#>><QuerySet [<Person: 108 Woman>]>
#>><QuerySet []>
现在的问题是,p2
的关系字段查询集返回空,我理解为什么当你考虑非递归关系时,但在这种情况下调用 p2.relationships_set
没有从某种意义上说,即使有,我怎么知道 Person
是关系的 person_1
还是 person_2
?
欢迎任何建议
这似乎是 How to make recursive ManyToManyField relationships that have extra fields symmetrical in Django? 但我不能标记它们
基本上这在 django 中是不可能的,因为你必须定义 symmetrical=False
。
您可以选择以相反的方式添加第二个 m2m
字段。另一个线程对此有一些很好的读物