当前位置: 首页 > 面试题库 >

在Django中链接多个filter(),这是一个错误吗?

全彬
2023-03-14
问题内容

我一直认为在Django中链接多个filter()调用总是与在单个调用中收集它们相同。

# Equivalent
Model.objects.filter(foo=1).filter(bar=2)
Model.objects.filter(foo=1,bar=2)

但是我在代码中遇到了一个复杂的查询集,情况并非如此

class Inventory(models.Model):
    book = models.ForeignKey(Book)

class Profile(models.Model):
    user = models.OneToOneField(auth.models.User)
    vacation = models.BooleanField()
    country = models.CharField(max_length=30)

# Not Equivalent!
Book.objects.filter(inventory__user__profile__vacation=False).filter(inventory__user__profile__country='BR')
Book.objects.filter(inventory__user__profile__vacation=False, inventory__user__profile__country='BR')

生成的SQL是

SELECT "library_book"."id", "library_book"."asin", "library_book"."added", "library_book"."updated" FROM "library_book" INNER JOIN "library_inventory" ON ("library_book"."id" = "library_inventory"."book_id") INNER JOIN "auth_user" ON ("library_inventory"."user_id" = "auth_user"."id") INNER JOIN "library_profile" ON ("auth_user"."id" = "library_profile"."user_id") INNER JOIN "library_inventory" T5 ON ("library_book"."id" = T5."book_id") INNER JOIN "auth_user" T6 ON (T5."user_id" = T6."id") INNER JOIN "library_profile" T7 ON (T6."id" = T7."user_id") WHERE ("library_profile"."vacation" = False  AND T7."country" = BR )
SELECT "library_book"."id", "library_book"."asin", "library_book"."added", "library_book"."updated" FROM "library_book" INNER JOIN "library_inventory" ON ("library_book"."id" = "library_inventory"."book_id") INNER JOIN "auth_user" ON ("library_inventory"."user_id" = "auth_user"."id") INNER JOIN "library_profile" ON ("auth_user"."id" = "library_profile"."user_id") WHERE ("library_profile"."vacation" = False  AND "library_profile"."country" = BR )

具有链接filter()调用的第一个查询集两次连接库存模型,从而有效地在两个条件之间创建了“或”,而第二个查询集将这两个条件与在一起。我期望第一个查询也将同时满足这两个条件。这是预期的行为,还是Django中的错误?


问题答案:

我的理解是,它们在设计上有细微的差别(并且我当然愿意接受更正):filter(A, B)将首先根据A进行过滤,然后根据B进行子过滤,同时filter(A).filter(B)将返回与A’匹配的行,并且可能会匹配B的行。



 类似资料:
  • 我已经从http://hayageek.com/login-with-google-plus-javascript-api/ 我已经使用我的client_id,api密钥实现了代码,并且还遵循了Google oauth2中invalid_client的说明,但仍然收到相同的错误。 也在OAuth同意屏幕中并提及产品名称和电子邮件地址 错误:无效_client 应用程序:Project_Name 您

  • 我学习数据结构和链表,但有些东西我不懂。一个对象怎么能存储这么多地址和数据。当我了解object时,我看到如果您想为一个变量存储许多数据,您需要创建新的对象,但现在在链表中,newNode对象将存储data1、next1、data2、next2,....大滩,下一个。 当程序运行list.insert(11)并且数据变为11时,为什么不删除原来为5的数据? 对不起,我的英语语法,任何反馈将被告知。

  • 问题内容: 我正在浏览我最喜欢的网站的html … ahem …,并且在标记中看到了这一点: “?d = 20090107”做什么?我假设它是某种日期,但是我不确定为什么它在文件路径中。有任何想法吗? 问题答案: 这样做是为了给文件名添加一些唯一性,以便当他们更改CSS文件时,他们可以更改额外的位,以完全确保每个客户端都将重新加载CSS,而不是使用缓存版本。 网络服务器将忽略该参数,并正常服务/C

  • 问题内容: / mysite / project4 详细信息和用户位于同一模块中,即/ mysite / project1在我定义的project1模型中 当我同步数据库时,出现错误提示 这怎么解决.. 谢谢.. 问题答案: 哎呀,我们只有这个。我回答… 您有许多django无法为其生成唯一名称的外键。 您可以通过在模型中的外键字段定义中添加“ related_name”参数来提供帮助。例如: 看

  • 问题内容: 我正在尝试使用jQuery和Ajax,并且使用了这种方法。但是我收到错误$ .toJSON不是firebug中的函数。问题出在哪里?我使用jquery 1.3.2。谢谢 问题答案: 没错 没有功能:http : //api.jquery.com/jQuery.toJSON。也许您想使用它。

  • 我注意到使用Reactor时的一些奇怪行为。场景是这样的: 调用rest APIendpoint,获取一个值,封装在Mono中 使用上述值调用另一个rest APIendpoint,检索另一个值,用Mono封装 压缩这两个结果 出现的情况是,onSubscribe(FluxMap.MapSubscriber)在第一个API调用中被调用两次,然后打开两个连接并生成两个结果。传递给第二个API调用的结