gpt4 book ai didi

python - 更改 Django 查询集的结构

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:47 24 4
gpt4 key购买 nike

我有几个从父模型继承的模型。

class ContentItem(models.Model):

COLUMN_CHOICES = (
(FIRST_COLUMN, 1),
(SECOND_COLUMN, 2),
(THIRD_COLUMN, 3),
)

row = models.ForeignKey(RowItem)
column = models.SmallIntegerField(choices=COLUMN_CHOICES, default=FIRST_COLUMN)
group = models.IntegerField(default=0, unique=False, null=False, blank=False)

objects = InheritanceManager()


class TextItem(ContentItem):

title = models.CharField(max_length=500, unique=False, null=True, blank=True)
content = models.TextField(max_length=50000, unique=False, null=True, blank=True)

class FaqItem(ContentItem):

question = models.TextField(max_length=1000, unique=False, null=True, blank=True)
answer = models.TextField(max_length=5000, unique=False, null=True, blank=True)

我正在使用 Django Model Utils 中的 InheritanceManager寻求返回子模型而不是父模型的帮助。

内容对象属于一行、一列以及一组内容对象(可选)。

当我使用 ContentItem.objects.filter(row__page=page).select_subclasses() 查询 ContentItems 时我得到这样的东西[<FaqItem: FaqItem object>, <FaqItem: FaqItem object>, <TextItem: TextItem object>] .

到目前为止,我可以了解他的结构中的数据,但我遇到了困难,无法在模板中实现所需的复杂 HTML 布局,特别是通过组字段对对象进行可选分组。

我认为将数据放在嵌套结构中可以很容易地循环并创建包含内容项的列的所需模板布局 - 其中一些是分组的,一些是独立的。即喜欢这样的解释:

content_items {
'rows': {
0: {
'columns': {
0: {
'faq_items': {
'groups': {
0: {
faq_obj,
faq_obj,
},
1: {
faq_obj,
faq_obj,
faq_obj,
},
},
faq_obj,
'text_items': {
'groups': {
0: {
text_obj,
text_obj,
},
},
text_obj,
text_obj,
text_obj,
}
1: ...
},
},
1: ...
}
}

这可能/建议吗?或者有什么办法可以在模板中做到这一点。目前看起来是这样的:

{% for content_item in content_items %}
{% if content_item.row == row and content_item.column == column_number %}
<div class="content-item">
{% include "content-item.html" %}
</div>
{% endif %}
{% endfor %}

'row' 和 'column_number' 被传递到此模板包含中。这工作正常。但是当内容项位于同一组中时,我想绕过 <div class="content-item"> div,这样我就可以直观地将属于同一组的内容项联系在一起。

最佳答案

这个答案告诉我从查询集中创建一个嵌套对象,对多个模型字段进行分组 - Nested GROUP BY in django: returning Objects 。我想出了这个:

content_items        = ContentItem.objects.filter(row__page=page).select_subclasses()
content_items_sorted = {}

for row, first_group in groupby(content_items, lambda x: x.row):
content_items_sorted[row] = {}
for column, second_group in groupby(first_group, lambda x: x.column):
content_items_sorted[row][column] = {}
for group, third_group in groupby(second_group, lambda x: x.group):
content_items_sorted[row][column][group] = list(third_group)

现在我可以使用嵌套 for 循环遍历模板中的行、列和组。

关于python - 更改 Django 查询集的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35960083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com