gpt4 book ai didi

python - 切片查询集与切片 __in 子句中使用的列表相同吗?无法理解这种行为

转载 作者:行者123 更新时间:2023-11-29 23:40:49 24 4
gpt4 key购买 nike

我有一个 Story 模型,其中包括通过 django 标记应用程序的 TagField。我正在获取特定标签的故事列表。从功能上讲,我的代码工作正常,但我遇到了一种我不太理解的行为。

以下代码正确地为我提供了所需的故事列表。

    ct = ContentType.objects.get_for_model(Story)
ti = TaggedItem.objects.filter(tag__name='mobile',content_type=ct).values_list('object_id',flat=True)
stories = Story.published_objects.filter(id__in=ti)

但是,我只想要前 50 个故事。所以我做了什么:

    ct = ContentType.objects.get_for_model(Story)
ti = TaggedItem.objects.filter(tag__name='mobile',content_type=ct).values_list('object_id',flat=True)
ti50 = ti[:50]
stories = Story.published_objects.filter(id__in=ti50)

在这里,我对列表本身进行切片,使其仅包含 50 个 id,然后将切片列表提供给 __in 子句。所以我预计列表中有 50 个故事。但是,我收到此错误:

   DatabaseError: (1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")

我不明白为什么在MySQL中使用LIMIT,尽管我试图在Python本身中预先对其进行切片。对此有何解释?

最佳答案

您不是“对列表本身进行切片”。 ti 仍然是一个查询集,切片本身仍然不评估它。因此,当您将其放入 __in 子句中时,它仍然是表示未评估的数据库查询的对象。 Django 尝试将其作为主 Story 查询中的子查询传递,但正如错误消息所示,MySQL 不支持这一点。

如果您想传递 50 个 ID,则必须通过转换为列表来显式评估查询:

ti50 = list(ti[:50])

关于python - 切片查询集与切片 __in 子句中使用的列表相同吗?无法理解这种行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com