首页 > 解决方案 > 将子对象中的特定字段连接到父对象中?

问题描述

我有两个模型:

class Chapter(models.Model):
    chapter = models.IntegerField()
    verses_amount = models.IntegerField()
    chapter_content = models.TextField()
    

class Verse(models.Model):
    chapter = models.ForeignKey(Chapter, on_delete=CASCADE)
    verse = models.TextField()
    verse_number = models.IntegerField()

在 上,我在字段Verse中存储了一个段落。verse我怎样才能查询所有孩子(Verse),获取他们的verse段落,连接所有这些并将其放入Chapter.chapter_content

例如

verses = Verse.objects.filter()[0:2]
for verse in verses:
    print(verse.verse)

>> 'Lorem Ipsum.'
>> 'Second Lorem Ipsum Iteration 2.'

在 parentChapter中,我想chapter_content将这两个值保存为一个长字符串:

'洛雷姆·伊普苏姆。第二个 Lorem Ipsum 迭代 2。

标签: djangodjango-orm

解决方案


你可以这样做:

chapter = Chapter.objects.get(chapter=1)  # or whatever chapter you want to get

content = ""

for verse in chapter.verse_set.all():
   content += f"{verse.verse} "

content = content.rstrip()

chapter.chapter_content = content
chapter.save()

但是将经文存储在Verse对象中和对象中一样是不好的做法Chapter,因为如果您只想更新一个经文怎么办?

您可以尝试在模型chapter_content中创建方法属性。Chapter

class Chapter(models.Model):
    chapter = models.IntegerField()
    verses_amount = models.IntegerField()

    @property
    def chapter_content(self):
        content = ""
        for verse in self.verse_set.all():
            content += f"{verse.verse} "
        return content.rstrip()
    

class Verse(models.Model):
    chapter = models.ForeignKey(Chapter, on_delete=CASCADE)
    verse = models.TextField()
    verse_number = models.IntegerField()

请注意,您仍然必须按其顺序号对经文进行排序。


推荐阅读