Django模型设计多对一?

Django Model Design many-to-one?

我正在尝试在 Django 中创建两个模型,'Paragraph' 和 'Sentences'。我似乎仍然不明白多对一功能是如何工作的。如果我想要一个包含多个句子的段落;我只是简单地添加一个 ForeignKey(Paragraph) 到 Sentences 模型中吗?这样我就可以在段落模型中存储多个句子。 感谢您在我尝试学习 Django 时提供的任何见解。

    class Sentence(models.Model):
        text = models.TextField(blank=True)
        order_number = models.IntegerField()
    
        def __str__(self):
            return self.text
    
    class Paragraph(models.Model):
        text = models.TextField(blank=True)
        order_number = models.IntegerField()
        sentences = models.ForeignKey(Sentence, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.text

一个ForeignKey是一个多对一关系。这意味着您定义模型的 多个 项目可以 link 到 target 模型的相同项目。

因此 Paragraph 是“父”模型,Sentence 是“子”模型:

class Paragraph(models.Model):
    text = models.TextField(blank=True)
    order_number = models.IntegerField()

    def __str__(self):
        return self.text

class Sentence(models.Model):
    text = models.TextField(blank=True)
    order_number = models.IntegerField()
    <b>paragraph</b> = models.ForeignKey(
        Paragraph,
        on_delete=models.CASCADE,
        <b>related_name='sentences'</b>
    )

    def __str__(self):
        return self.text

因此,您可以将 Paragraph 和多个句子全部 link 到同一段落:

p1 = Paragraph.objects.create(text='Act 3, Scene 1', order_number=0)
s1 = Sentence.objects.create(
    text='To be, or not to be, that is the question',
    <b>paragraph=p1</b>,
    order_number=0
)
s2 = Sentence.objects.create(
    text='Whether 'tis nobler in the mind to suffer',
    <b>paragraph=p1</b>,
    order_number=1
)

然后您可以查询 p1 的所有 相关 句子:

p1<b>.sentences</b>.all()