django - 通过 Django 中的同一中间模型,两个 ManyToMany 关系与同一模型

标签 django django-models django-1.11

我的模型:

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/

相关文章:

Django-tinymce 和 django-filebrowser,图像上传查找上传文件夹时出错(MEDIA_ROOT + DIRECTORY)

python - 反转 'update_comment',参数为 '(' ',)' not found. 1 pattern(s) tried: [' comment\\/(?P<news_pk>[0-9]+)$']

python - 在 Django 中将 Self 定义为多个属性

python-3.7 - logout() 得到了一个意外的关键字参数 'next_page'

python - 具有多表继承的 Django 1.11 上的可能错误或 python 3.5 上的可能错误还是我?

python - 是否可以在管理员之外使用 django-modeltranslation?

django - 为 DRF、Django 和 React 前端配置 Nginx 和 Gunicorn

python - Django 1.8,多种自定义用户类型

python - 使模型字段等于 Django 中两个字段的串联

django - 特定 Django 模型的高级搜索