Django queryset 'in' 运算符在第一次调用时失败

Posted

技术标签:

【中文标题】Django queryset \'in\' 运算符在第一次调用时失败【英文标题】:Django queryset 'in' operator fails on first callDjango queryset 'in' 运算符在第一次调用时失败 【发布时间】:2013-04-02 04:10:34 【问题描述】:

在查询集上使用“in”运算符时,第一次调用失败。

编辑 4:

我已将我的问题简化为以下代码,任何人都应该可以轻松测试。

from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=100)


class Project(models.Model):
    categories = models.ManyToManyField(Category, related_name='projects')    


category_list = Category.objects.prefetch_related('projects')


print category_list # [<Category: Category object>, <Category: Category object>]
print category_list[0] in category_list # False
print category_list[0] in category_list # True

如果我删除“prefetch_related”并改用“all”,那么问题就消失了,但这会使用更多的数据库调用。

如何使用 prefetch_related 第一次得到正确的结果?

【问题讨论】:

这听起来像是您的应用程序逻辑中的一个错误,请进行更多测试或添加视图代码。 请添加查看源代码。 正如 thnee 和 adrianp 所说的那样 - 该错误可能比其他地方更多。此外,过滤掉“非活动”类别或区别对待它们也是一种非常低效的方法...... 这对我来说似乎是一个有效的问题。有什么问题? 对这个问题投了反对票的人,不喜欢这个。 【参考方案1】:

在 Django 文档 here 中,它显示的代码与您的代码相同,但在 prefetch_related 前面有一个 .all()

也许没有那个 Django 可能对查询太懒了?我认为它可能会等到第一个切片 [0] 并将其解释为查询(LIMIT 0),但这并不能解释显示那里所有内容的打印语句。无论哪种方式,它看起来都像一个错误 - 无法想象这是“预期的行为”。

你能用.all() in 试试并报告输出吗?

【讨论】:

是的。我尝试使用 .all() 并没有解决问题。我打开了一张已被接受的错误票。 code.djangoproject.com/ticket/20242

以上是关于Django queryset 'in' 运算符在第一次调用时失败的主要内容,如果未能解决你的问题,请参考以下文章

Django Queryset __in 列表中没有值

七 Django框架,models.py模块,数据库操作——F和Q()运算符:|或者&并且——queryset对象序列化

在 Django 1.11 中将 QuerySet 传递给 Celery 任务

NoReverseMatch at ...... in django

如何将 Django QuerySet 转换为列表?

Django 不返回QuerySets的API