【问题标题】:Django Model Design many-to-one?Django 模型设计多对一?
【发布时间】:2021-03-17 17:49:38
【问题描述】:

我正在尝试在 Django 中创建两个模型,“段落”和“句子”。我似乎仍然不明白多对一功能是如何工作的。如果我希望有一个包含多个句子的段落;我是否只需将 ForeignKey(Paragraph) 添加到 Sentences 模型中?这样我就可以在 Paragraph 模型中存储多个句子。 感谢您在我尝试学习 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

【问题讨论】:

  • 请展示你的模特
  • 是的,你在正确的轨道上。一个段落可以有多个句子,但一个句子只能有一个段落。因此,句子的段落有一个外键。您可以通过执行Para.sentence_set.all() 来检索段落的句子,其中Para 是段落对象。

标签: django django-models foreign-keys one-to-many many-to-one


【解决方案1】:

ForeignKey多对一 关系。这意味着您定义模型的多个项可以链接到目标模型的同一项。

因此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()
    paragraph = models.ForeignKey(
        Paragraph,
        on_delete=models.CASCADE,
        related_name='sentences'
    )

    def __str__(self):
        return self.text

因此,您可以创建一个Paragraph 和多个链接到同一段落的句子:

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',
    paragraph=p1,
    order_number=0
)
s2 = Sentence.objects.create(
    text='Whether 'tis nobler in the mind to suffer',
    paragraph=p1,
    order_number=1
)

你可以查询p1的所有相关句:

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

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2019-09-15
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2020-05-04
    相关资源
    最近更新 更多