我的模型:
class Person(SchoolModel):
first_name = models.CharField(max_length=75)
last_surname = models.CharField(max_length=75)
students = models.ManyToManyField('self', through='StudentParent',
through_fields=('parent', 'student'), related_name='+')
parents = models.ManyToManyField('self', through='StudentParent',
through_fields=('student', 'parent'), related_name='+')
class StudentParent(SchoolModel):
student = models.ForeignKey('Person')
parent = models.ForeignKey('Person')
relation = models.CharField(max_length=26)
class Meta:
unique_together = ('student', 'parent')
如上所示,Person 模型与其自身有两种 M2M 关系:学生和家长。每个人的同一张 Person 表上可能有很多学生,也可能有很多家长。
但是,Django 不允许这样做:
Person: (models.E003) The model has two many-to-many relations through
the intermediate model 'StudentParent'.
我不明白为什么 Django 拒绝这样做,特别是因为它不使用自定义中间表保存或验证 m2m 字段。另一方面,我只需要使用这些字段就可以更轻松地检索相关模型。示例:
person_obj.students.all()
Person.objects.filter(parents__in=another_person_queryset)
所以我的问题是,1)Django1.11中有没有办法解决这个问题(通过配置等使这样的2个m2m字段成为可能)? 2)有没有办法通过其他方式在只读场景中实现这种情况?
使用中间模型的代理会欺骗 django 来实现 1) 吗? 使用自定义管理器有助于实现 2) 吗?最短、最整洁的路径是什么?
注意:我知道类似的 question之前被问过,但是有点不同并且有点旧。
最佳答案
似乎通过代理模型欺骗 Django 可以达到我上面描述的目的(检索模型实例或过滤查询集中的相关数据)。所以模型变成:
class Person(SchoolModel):
first_name = models.CharField(max_length=75)
last_surname = models.CharField(max_length=75)
students = models.ManyToManyField('self', through='StudentParentProxy', # << !!!!!!
through_fields=('parent', 'student'), related_name='+')
parents = models.ManyToManyField('self', through='StudentParent',
through_fields=('student', 'parent'), related_name='+')
class StudentParent(SchoolModel):
student = models.ForeignKey('Person')
parent = models.ForeignKey('Person')
relation = models.CharField(max_length=26)
class Meta:
unique_together = ('student', 'parent')
class StudentParentProxy(StudentParent):
class Meta:
proxy = True # << !!!!!!
关于django - 通过 Django 中的同一中间模型,两个 ManyToMany 关系与同一模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43553099/