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()
メソッドを 2 回使用して目的の結果を得ることができます。ご覧のとおり、2 つJOIN
の s を使用して 2 つの外部キーを検索します。
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 の 2 つの異なる注文を参照していることを理解する代わりに、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()