多对多(非递归)
class A(models.Model):
pass
class B(models.Model):
parents = models.ManyToManyField(A, related_name='children')
>>> A._meta.get_all_field_names()
['children', u'id']
>>> B._meta.get_all_field_names()
[u'id', 'parents']
我可以获取模型实例的子集和父集a.children.all()
and b.parents.all()
外键(递归)
class FK(models.Model):
parent = models.ForeignKey('self', related_name='child')
>>> FK._meta.get_all_field_names()
['child', u'id', 'parent']
任何实例FK
现在将能够得到它的父母和孩子fk.parent
and fk.child
多对多(递归)
class M2M(models.Model):
parents = models.ManyToManyField('self', related_name='children')
>>> M2M._meta.get_all_field_names()
[u'id', 'parents']
人们会期望,就像我可以访问a.children
and fk.child
,我也可以访问m2m.children
。事实似乎并非如此。
我如何访问m2m.children
?
我正在使用 Django 1.6.5。
备查
As 丹尼尔·罗斯曼的回答 https://stackoverflow.com/a/24536580/3694224说,设置symmetrical=False
解决问题。在一个姜戈门票 https://code.djangoproject.com/ticket/12641解释为:
在父/子的情况下,关系不对称 - 如果 A 是 B 的子项,并不意味着 A 是 B 的父项。
With symmetrical=False
, 中指定的逆关系related_name
就像外键情况一样创建:
class M2M(models.Model):
parents = models.ManyToManyField('self', related_name='children', symmetrical=False)
>>> M2M._meta.get_all_field_names()
[u'id', 'parents', children]
>>> parent.children.add(child)
>>> parent.children.all() # returns QuerySet containing the child
>>> child.parents.all() # returns QuerySet containing the parent