更改Django querys的结构

2024-10-02 00:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个模型继承自父模型。在

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布局,特别是通过group字段对对象进行可选分组。在

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

^{pr2}$

这可能/可取吗?或者有什么方法可以在模板中完成。目前的情况如下:

^{3}$

“行”和“列编号”传递到此模板include中。这行得通。但是,当内容项在同一组中时,我想绕过<div class="content-item">div,这样就可以直观地将属于同一组的内容项绑定在一起。在


Tags: 模型模板falsetrue内容modelscolumnnull
1条回答
网友
1楼 · 发布于 2024-10-02 00:39:58

这个答案告诉我如何从一个查询集创建一个嵌套对象,分组在多个模型字段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循环遍历模板中的行、列和组。在

相关问题 更多 >

    热门问题