为Django的多对多关系定义一个连接表是最佳实践吗?



我有以下代码:

class Tutors(models.Model):
first_name = models.CharField(max_length=20, default=None, blank=False) #you need to add default none and blank false to enforce the Not-Null constraint
last_name = models.CharField(max_length=20, default=None, blank=False)
email = models.EmailField(max_length=254,default=None, blank=False)
birth_day = models.DateField(auto_now=False, auto_now_add=False, default=False, blank=False)
def __str__(self):
return(self.first_name + ' ' + self.last_name)

class ArtSubjects(models.Model):
subject_name = models.CharField(max_length=20, default=None, blank=False)
tutors = models.ManyToManyField(Tutors)
def __str__(self):
return self.subject_name

我的问题是,我应该这样定义多对多关系吗?还是应该为表定义一个新类?

我问的原因是,我可以通过ArtSubjects类查询从连接表中获得对象,像这样-adobeAI.tutors.all()返回<QuerySet [<Tutors: Matt Aird>, <Tutors: Tom John>]>

但是我想不出一种方法来通过导师查询连接表来查看个别导师教什么课。

有什么建议吗?

你可以用同样的方式查询导师。下面是一个例子:

john = Tutors.objects.get(first_name="John")
john.artsubjects_set.all()

如果你想有一个比_set更容易读的名字,在ManyToManyField字段上添加一个related_name:

class ArtSubjects(models.Model):
tutors = models.ManyToManyField(Tutors, related_name="teaches")
...
john.teaches.all()

您可以在文档中找到更多详细信息https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/

这是可以做到的(参见https://docs.djangoproject.com/en/3.2/topics/db/models/#extra-fields-on-many-to-many-relationships),但如果您不向中间模型添加额外的数据,我不建议这样做。

Django会在后台创建中间模型。在这种情况下,它将作为ArtSubjects.tutors.through访问。

关于如何查询关系,请参阅@Marco的回答。

最新更新