首页 > 解决方案 > 查询 django 模型以检索集合列表

问题描述

我想获取与用户关联的所有对象,并根据一些附加逻辑将检索到的列表拆分为 UI 中的三个不同列表。我目前正在通过@property在模型上设置 a 然后在模板中执行一堆循环和 if/else 来执行此操作。这显然是次优的,因为如果实际部分中没有任何内容,我不想包含部分标题,但是由于我要拉入一个大列表,因此没有empty状态。

当前的:

模型

class Entry(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     publish_date = models.DateField(null=True, blank=True)
     favorite = models.BooleanField(default=False)

看法

entries = Entry.objects.filter(user=request.user)

模板

<strong>FAVORITES</strong>
{% for obj in entries %}
  {% if obj.group == 'favorites' %}
    ...
  {% endif %}
{% endfor %}

<strong>PUBLISHED</strong>
{% for obj in entries %}
  {% if obj.group == 'published' %}
    ...
  {% endif %}
{% endfor %}

<strong>DRAFT</strong>
{% for obj in entries %}
  {% if obj.group == 'draft' %}
    ...
  {% endif %}
{% endfor %}

我应该如何在模型(例如get_groupings)上添加一个方法,该方法可以以数据库有效的方式返回一个包含三个单独查询集的字典('entries ['favorites] =')?

标签: djangodjango-models

解决方案


如果您很少写入数据库并经常阅读,最好将您的属性保存在数据库字段中,然后再做一秒钟.filter()

否则,是的,你应该在模型上添加一个方法——这就是这个逻辑所属的地方。如果您希望它每次都返回所有三个组,那么就没有或多或少的数据库效率之类的东西:只需像现在一样从数据库中提取所有对象,然后使用列表理解或喜欢。这个性能应该不用担心。如果是:见第一段。


推荐阅读