Plenty for many (non-recursive)
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']
I can get a set of child and parent model instances with a.children.all()andb.parents.all()
Foreign key (recursive)
class FK(models.Model):
parent = models.ForeignKey('self', related_name='child')
>>> FK._meta.get_all_field_names()
['child', u'id', 'parent']
Any instance FKcan now get both parent and child with fk.parentandfk.child
From many to many (recursive)
class M2M(models.Model):
parents = models.ManyToManyField('self', related_name='children')
>>> M2M._meta.get_all_field_names()
[u'id', 'parents']
One would expect that, as I could access a.childrenand fk.child, I could also access m2m.children. This does not seem to be the case.
How do I access m2m.children?
I am using Django 1.6.5.
For future reference
As Daniel Roseman answers , installation symmetrical=Falsesolves the problem. The Django ticket explains how:
/ - A B, , A B.
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()
>>> child.parents.all()