我在一个名为main
Django 1.3 的应用程序中使用以下数据初始化了这些模型:
from django.db.models import Model, FloatField, CharField, ForeignKey, Q
class Customer(Model):
name = CharField(max_length=64)
class Order(Model):
customer = ForeignKey(Customer)
order_total = FloatField()
c = Customer(name="John Smith")
c.save()
Order(customer=c, order_id=9).save()
Order(customer=c, order_id=13).save()
如何使用Q()
对象构造查询以查找拥有订单 9 和订单 13 的客户?
在不使用Q()
对象的情况下,我可以使用该.filter()
方法两次来获得我想要的结果。如您所见,它使用两个JOIN
s 来查找两个外键:
queryset = Customer.objects.filter(order__order_id=9).filter(order__order_id=13)
return HttpResponse("%s\n\n%s" % (queryset, queryset.query), content_type="text/plain")
[<Customer: Customer object>]
SELECT "main_customer"."id", "main_customer"."name"
FROM "main_customer"
INNER JOIN "main_order" ON ("main_customer"."id" = "main_order"."customer_id")
INNER JOIN "main_order" T3 ON ("main_customer"."id" = T3."customer_id")
WHERE ("main_order"."order_id" = 9 AND T3."order_id" = 13 )
我尝试使用Q()
以下对象做同样的事情。它没有理解我指的是两个不同的订单,一个 ID 为 9,一个 ID 为 13,而是认为我正在寻找一个 ID 为 9 和 13 的订单。这显然是不可能的,因此它不返回任何结果:
q = Q(order__order_id=9) & Q(order__order_id=13)
queryset = Customer.objects.filter(q)
return HttpResponse("%s\n\n%s" % (queryset, queryset.query), content_type="text/plain")
[]
SELECT "main_customer"."id", "main_customer"."name"
FROM "main_customer"
INNER JOIN "main_order" ON ("main_customer"."id" = "main_order"."customer_id")
WHERE ("main_order"."order_id" = 9 AND "main_order"."order_id" = 13 )
我希望 Django 的引擎能够等效地解释这两个查询,但显然Q()
对象的处理方式不同。如何使用对象通过多个外键引用过滤对象,而不是多次Q()
调用?.filter()