【问题标题】:AttributeError: 'list' object has no attribute 'order_by'AttributeError:“list”对象没有属性“order_by”
【发布时间】:2020-11-24 19:44:29
【问题描述】:

我试图通过itertools chain python 预定义函数组合两个queryset 对象并使用order_by 过滤它。但我得到了一个AttributeError'list' object has no attribute 'order_by'
如果有人能弄清楚我做错了什么,那么将不胜感激。非常感谢您。

views.py:

try:
    qs = Conversation.objects.filter(
        Q(chat__from_user=user) &
        Q(chat__to_user=to_user))

    qs_2 = Conversation.objects.filter(
        Q(chat__from_user=to_user) &
        Q(chat__to_user=user))
except:
    raise ValidationError({"message":"bad request"})

all_qs = list(chain(qs, qs_2)).order_by('-created_on')

【问题讨论】:

  • 您是否阅读了错误文本?您也可以使用 or 将过滤条件合并到一个查询中

标签: python django django-rest-framework


【解决方案1】:

你不能.order_by(…)一个列表。但你实际上并不需要这个。您可以简单地“合并”这两个查询集,然后使用:

from django.db.models import Q

all_qs = Conversation.objects.filter(
        Q(chat__from_user=user, chat__to_user=to_user) |
        Q(chat__from_user=to_user, chat__to_user=user)
).order_by('-created_on')

根据经验,最好尽量避免使用列表,因为即使您设法在 Django/Python 级别对这些列表进行排序,它的效率通常也低于数据库级别,这是一个系统旨在有效地完成这些事情。

【讨论】:

  • 在数据库级别执行此操作是什么意思?这个过滤器不是将它转发到数据库吗?如果不是,你会在哪里做呢?
  • @BenjaminK:是的。该评论是关于避免在查询集上调用 list(...) 并且不能与 filter(..)sorted(..) 一起使用,因为那时它是在 Django/Python 级别而不是在数据库上完成的。
  • 感谢您的回答。那么它们应该在哪里排序呢? (什么文件(还是views.py),什么方法?)
  • @BenjaminK:在数据库中,所以用.order_by('-created_on'),因为会放在SQL查询中。
  • 非常感谢您进一步概述您的答案。现在我明白了:) 所以我的代码中的所有内容都是正确的,因为我已经使用了order_by,这将在数据库级别进行排序。 Greatfull 可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2014-09-08
  • 2016-01-30
  • 2020-12-15
  • 2016-04-15
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多