Django-定义ManyToMany关系的最佳方法

时间:2018-08-14 07:16:17

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

我想知道在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)

1 个答案:

答案 0 :(得分:2)

在我看来,这个问题虽然有点儿基于意见,但对于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的情况下进行这些查询。该示例虽然很简单,但是应该提供有关我的想法的基本思想。