【问题标题】:Django problems in query查询中的Django问题
【发布时间】:2015-01-21 11:25:56
【问题描述】:

我有一个模型可以在 Django 开发环境下访问数据库。我希望这样做:

Friends.objects.filter(pk__contains=str)[:20].filter(invite_id=77)

但我收到此错误:

File "<console>", line 1, in <module>
File "D:\INSTALL\Python\lib\site-packages\django\db\models\query.py", line 691
, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "D:\INSTALL\Python\lib\site-packages\django\db\models\query.py", line 703
, in _filter_or_exclude
"Cannot filter a query once a slice has been taken."

查询一次后,我已经拿到了 20 件商品。为什么我再次查询无法获得物品?

注意:我理解错误,但我想再次查询。这肯定不是一个好主意,因为我得到了错误。谁知道更好的方法?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    您必须限制应用过滤器之后返回的结果数量。这就是 SQL 的工作原理(WHERELIMIT 之前):

     Friends.objects.filter(invite_id=77)[:20]
    

    【讨论】:

    • 这与我解释原始代码的行为略有不同。这将找到前 20 个匹配对象,而不是前 20 个对象中的所有匹配项。我不确定需要什么。
    • 确实如此,但是在限制结果之后实现过滤器是相当复杂的。有些数据库可以通过子查询来实现,但 MySQL 不行。唯一独立于数据库的选项是 Python 端实现,这在 I/O 和 CPU 端会很昂贵。
    • @KlausD.:因为它只有 20 条记录,所以真的没有必要让数据库来做这项工作。 [f for f in Friends.objexts.all()[:20] if f.invite_id == 77] 成功了,在不太可能的情况下,这正是 OP 真正想要的。
    • 这实际上与 SQL 子句的顺序无关。 Django 动态构建 SQL 语句,并不关心 ORM 调用的顺序。这里的问题只是对查询集进行切片会执行查询,因此您无法对其进行任何进一步的过滤..
    猜你喜欢
    • 2011-02-04
    • 2010-12-31
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多