【发布时间】:2019-01-30 22:47:18
【问题描述】:
我试图了解如何正确设置我的模型以建立多对多关系,我注意到在创建模型时有一个 ManyToManyField 选项,但我似乎无法理解它的逻辑以及如何使其正常工作。我想分享我的代码并一路解释。
from django.db import models
class Major(models.Model):
name = models.CharField(max_length=30, db_index=True)
class School(models.Model):
name = models.Charfield(max_length=50, db_index=True)
majors = models.ManyToManyField(Major)
class Professor(models.Model):
ProfessorIDS = models.IntegerField()
ProfessorName = models.CharField(max_length=100)
ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
NumberOfRatings = models.CharField(max_length=50)
school = models.ForeignKey(School , on_delete=models.CASCADE)
major = models.ForeignKey(Major , on_delete=models.CASCADE)
请注意,School TABLE (Class) 有一个多对多的专业,这本质上是我想要的,目标是让数据库允许在单个学校下存储多个专业。
在做了一些研究后,我得出的结论是,这没有意义,最好创建一个 Bridge Table 所以我决定像这样创建我的模型......
from django.db import models
class Major(models.Model):
name = models.CharField(max_length=30, db_index=True)
class School(models.Model):
name = models.Charfield(max_length=50, db_index=True)
class School_Majors(models.Model):
school = models.ForeignKey(School, on_delete=models.CASCADE)
major = models.ForeignKey(Major, on_delete=models.CASCADE)
class Professor(models.Model):
ProfessorIDS = models.IntegerField()
ProfessorName = models.CharField(max_length=100)
ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
NumberOfRatings = models.CharField(max_length=50)
school = models.ForeignKey(School , on_delete=models.CASCADE)
major = models.ForeignKey(Major , on_delete=models.CASCADE)
这难道不是一种更合适的方式来设置数据库以便在学校中添加和删除多个专业,反之亦然?
【问题讨论】:
-
你的两个sn-ps基本上没有区别。您认为明确定义
School_Majors模型有什么优势? (也作为代码风格点,对类使用UpperCamelCase,对模型使用单数名称)。
标签: django python-3.x django-models