django - 将子对象中的特定字段连接到父对象中?
问题描述
我有两个模型:
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。
解决方案
你可以这样做:
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()
请注意,您仍然必须按其顺序号对经文进行排序。
推荐阅读
- java - java - 如何在java中正确地使客户端服务器说话?
- python - Neo4j csv 数据摄取节点被复制
- c# - Git自动合并在挑选樱桃时删除了一些信息
- javascript - document.getElementById(...) 在javascript中为空
- apache-spark - 带有火花结构流数据的 Azure eventhub
- amazon-web-services - 新 AWS Gateway UI 的映射模板
- android - 如何减少Android中Workmanager的时间段?
- python - 如何使用正则表达式从字符串中获取特定数字部分
- c# - 这个对象初始化有什么区别
- python-3.x - 重塑熊猫数据框并将第一列作为标题并旋转其上的所有数据