Associated name for many to many recursive relationship doesn't work

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()  # returns QuerySet containing the child
>>> child.parents.all()    # returns QuerySet containing the parent
+4
1

symmetrical=False. ManyToManyField :

Django , , ManyToManyField , person_set Person. ManyToManyField - , , .

, , False. Django , ManyToManyField .

+3

Source: https://habr.com/ru/post/1546883/


All Articles