我应该使用什么类型的数据库关系?

时间:2018-06-13 12:53:35

标签: python django database sqlite

from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

    class Meta:
        ordering = ('headline',)

我在Django文档中发现了这个一对多的关系示例,我将如何进行另一个名为Magazine的类。在课堂杂志中,它将包含许多记者撰写的许多文章。我还会使用多对一关系,还是需要一对一的关系?谢谢,提前获得任何帮助

3 个答案:

答案 0 :(得分:1)

这真的取决于你想做什么...... 你必须更具体,并告诉我们你的问题到底是什么。

  1. 如果您的杂志中有n篇文章,并且每篇文章都会出现 在一本杂志中,你必须使用一对多。

  2. 如果文章可以在多个杂志中出现,则必须使用 多对多的关系。

  3. 顺便说一句,这实际上并不是一个蟒蛇问题......

答案 1 :(得分:1)

这是 ForeignKeyArticleMagazine ,或 ManyToManyFieldArticle和{之间{1}} 即可。这取决于一篇文章是否可以出现在多个杂志中(记者经常将相同的文章卖给不同的杂志,然后,除了一些格式,逐字逐句)。

如果每篇文章都出现在一个杂志中,那么我们就这样实现:

Magazine

如果文章可以未发布,那么您可能还必须在class Article(models.Model): headline = models.CharField(max_length=100) pub_date = models.DateField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) magazine = models.ForeignKey(Magazine, on_delete=models.CASCADE) def __str__(self): return self.headline class Meta: ordering = ('headline',)构造函数中设置null=True

如果是ForeignKey,django将隐式创建一个类似ManyToManyField的表,用于存储从article_magazineArticle s的映射(但如果您查询,则只能获得Magazine s。。

关系很可能 Magazine 。事实上,OneToOneFieldOneToOneField ForeignKey。这意味着没有两个unique=True相同的 Article中发布。因此,这意味着每个Magazine都没有或完全一个Magazine与之相关。

答案 2 :(得分:1)

根据您的需要,我认为您应该参考多对多关系

  1. 您认为,可以使用多个报告对象发布文章,而报告者有多个文章对象,然后参考https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_many/

  2. 如果你的Logic每篇文章支持一名记者,每位记者支持多篇文章,请访问: https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_one/