将子对象中的特定字段连接到父对象中?



我有两个模型:

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.'

在父Chapter中,我希望chapter_content将两个值保存为一个长字符串:

Lorem Ipsum。第二次Lorem Ipsum迭代2.'

你可以这样做:

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()

请注意,您仍然必须按照它们的顺序号对诗句进行排序。