繁体   English   中英

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

[英]Is it best practice to define a join table for Django many to many relationships?

我有以下代码:

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 ,加related_name在ManyToManyField字段:

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 的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM