首页 > 解决方案 > 有没有办法在 Django 模型的查询集中隐藏对象?

问题描述

就像您看到下面的代码一样,我手动使用模型中的属性statusStore显示我的商店HTML Templates。问题是我编写的代码越多,重复的代码就越多。

我试图找到一种方法来避免那些低效的重复。是否可以设置models.py为仅显示活动商店以显示在 HTML 模板中?

我问这个是因为我已经做了类似的事情。我有一个字符串类型属性,但我需要在我的模板中以列表格式使用它,所以我创建了一个函数来仅使用列表格式调用它。但是,我不知道如何以同样的方式隐藏非活动商店。

谁能给我一些建议吗?

模型.py

class Store(models.Model):

    status = models.CharField(max_length=20,
        choices=(
            ('active', 'Active'), # ('Stored value', 'Label shown on the UI')
            ('inactive', 'Inactive'),
        ),
        default='inactive')
    ...

HTML 模板

{% if store.status == 'active' %}
    ... Show store
{% else %}
    ... Do not show store
{% endif %}

标签: django

解决方案


但是,通常人们只需要选择完整对象集的一个子集。要优化初始 QuerySet,以下是两种最常用的方法:

在将查询集发送到模板之前使用filter()exclude()您的查询集一起使用。

filter(kwargs**)
返回一个新的 QuerySet ,其中包含与给定查找参数匹配的对象。

active_stores = Store.objects.filter(status='active')
# send active_stores to template

或者

exclude(kwargs**)
返回一个新的 QuerySet ,其中包含与给定查找参数不匹配的对象。

active_stores = Store.objects.exclude(status='inactive')
# send active_stores to template

在您的模板中,您可以循环访问而不会出现非活动商店的问题

{% for store in active_stores %}
    {{商店}}
{% 空的 %}
    没有商店
{% endfor %}

请参阅Django 文档中的进一步说明


推荐阅读