私は Django の経験があまりないので (私は 1.3 を使用しています)、これはばかげた質問だと頭の後ろに感じています... しかしとにかく:
私はこのようなモデルを持っています:
class User(models.Model):
name = models.CharField()
class Product(models.Model):
name = models.CharField()
public = models.BooleanField()
class Order(models.Model):
user = models.ForeignKey(User)
product = models.ManyToManyField(Product, through='OrderProduct')
class OrderProduct(models.Model):
product = models.ForeignKey(Product)
order = models.ForeignKey(Order)
expiration = models.DateField()
そして、私がこのようなクエリを実行するとしましょう
Product.objects.filter(order__status='completed', order__user____id=2)
したがって、User2
購入したすべての製品を取得します (単に としましょうProduct1
)。涼しい。しかし今、私はその製品の有効期限が欲しいのですが、呼び出すとwithProduct1.orderproduct_set.all()
のすべてのエントリを取得することになりますが、クエリセットから返されたものだけが必要です。OrderProducts で別のクエリを実行できることはわかっていますが、以前に実行したクエリで既に取得できるデータを取り戻すためだけに、データベースに別のヒットが発生します。その上で私に与えます:OrderProduct
Product1
.query
SELECT "shop_product"."id", "shop_product"."name"
FROM "shop_product"
INNER JOIN "shop_orderproducts" ON ("shop_product"."id" = "shop_orderproducts"."product_id")
INNER JOIN "shop_order" ON ("shop_orderproducts"."order_id" = "shop_order"."id")
WHERE ("shop_order"."user_id" = 2 AND "shop_order"."status" = completed )
ORDER BY "shop_product"."ordering" ASC
特定のフィールドの代わりにできればSELECT *
、必要なすべてのデータを 1 つのクエリで取得できます。そのクエリを作成して、それに関連するデータのみを取得する方法はありますか?
編集 いくつかの点を明確にする必要があると感じています。明確になっていないことを申し訳ありません:
一部の製品は公開されており、購入する必要がないため、照会して
OrderProduct
いませんが、それでもそれらをリストする必要があり、それらは照会によって返されませんOrderProduct
私が期待している結果は、製品のリストとその注文データ (ある場合) です。JSON では、次のようになります。
[{id: 1、注文: 1、有効期限: 2013-03-03、公開: false}、{id: 1、注文: 、有効期限: 、公開: true
ありがとう