django - Django - 定义多对多关系的最佳方式
问题描述
我想知道在 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)
解决方案
在我看来,这个问题有点基于意见,尽管对于 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
. 诚然,这个例子非常简单,但应该提供一个关于我的想法的基本概念。
推荐阅读
- docusignapi - 在不向签名者发送通知电子邮件的情况下实施签署文档选项
- node.js - 有没有办法在 React 中访问根目录之外的图像
- node.js - 我如何使用 sequelize 搜索具有纬度和经度的数据库表
- javascript - 从平面列表父子创建分层对象
- node.js - 在 Heroku 上成功部署了我的应用程序,但没有显示其他设备
- c++ - char 向量可以越界吗?
- php - 在 IIS 上托管 PHP 应用程序,然后是数据库驱动程序错误
- python - 将 2D 数组重塑为 3D 数组以进行 tiff 转换
- ruby-on-rails - 如何在不进行迁移的情况下切换 Rails 数据库?
- javascript - 如何在反应javascript中将unicode转义序列转换为unicode字符