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框架,models.py模块,数据库操作——F和Q()运算符:|或者&并且——queryset对象序列化
在 Django 1.11 中将 QuerySet 传递给 Celery 任务