【问题标题】:Django - best way for defining a ManyToMany relationshipDjango - 定义多对多关系的最佳方式
【发布时间】:2018-08-14 07:16:17
【问题描述】:

我想知道在 Django 中定义多对多关系的最佳方法是什么。这种方式正确吗?

class Student(models.Model):
    name = models.CharField(max_length=100)


class Teacher(models.Model):
    name = models.CharField(max_length=100)


class StudentTeacher(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    extra_field = models.CharField(max_length=200)

使用through有什么好处?

class Student(models.Model):
    name = models.CharField(max_length=100)

class Teacher(models.Model):
    name = models.CharField(max_length=100)
    students = models.ManyToManyField(Student, through='StudentTeacher')

class StudentTeacher(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    extra_field = models.CharField(max_length=200)

【问题讨论】:

  • 差异在 Django 文档中得到了很好的描述:docs.djangoproject.com/en/2.1/topics/db/models/… 基本上,这两种方法都有效,但是,对于through 表,有一些额外的验证和有意义的限制,所以你不要不必考虑它们。
  • @petr 你应该重新发布你的评论作为答案。

标签: django django-models many-to-many


【解决方案1】:

在我看来,这个问题有点基于意见,尽管对于 SO 来说仍然是一个有效的问题。因此,我的回答在某种程度上也会自以为是。

没有绝对的最佳方法。或者更好地说,最好的方法总是取决于用例和需求。

在这种情况下,我强烈希望使用through(而且可能更频繁)。

您想如何查询您的数据?拥有ManyToManyField,您还可以在其中指定related_name,这将产生可读且因此可维护的代码。

我们看一下这个例子(加粗改):

class Teacher(models.Model):
    name = models.CharField(max_length=100)
    students = models.ManyToManyField(
        Student,
        through='StudentTeacher',
        related_name='teachers'
    )

现在查询可能如下所示:

it_student = Student.objects.get(pk=1)
it_teachers = it_student.teachers.all()
biology_teacher = Teacher.objects.get(pk=1)
biology_student = biology_teacher.students.all()

现在尝试在不指定ManyToManyField 的情况下执行这些查询。诚然,这个例子非常简单,但应该提供一个关于我的想法的基本概念。

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2014-11-25
    • 1970-01-01
    • 2012-08-12
    • 2015-02-03
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多