python - 更改 Django 查询集的结构

标签 python django django-models django-templates

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

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/

相关文章:

python - 使用 matplotlib 绘制热图

django - 如何在 Windows 中退出 "python manage.py runserver"

python - 无法通过模型实例访问管理器

Django:从日期时间字段查询时间

python - 在层次结构中显示类别和子类别

python - 从 bash 运行 python 时输入丢失字符串格式

python - 处理 csv 文件的一行

python - 如何将数据框的包含数字日期的列更改为文本形式?

Django REST Framework View 集每个操作权限

图像字段未更新的 Django 内联表单集