【发布时间】:2012-09-09 20:25:47
【问题描述】:
我已经在 Django 1.3 下名为 main 的应用程序中使用以下数据初始化了这些模型:
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() 方法两次来获得我想要的结果。如您所见,它使用两个JOINs 来查找两个外键:
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()?
【问题讨论】:
-
我不确定如何最好地描述我正在尝试做的事情。欢迎提出新的标题建议。
标签: python django django-orm django-1.3 django-q