1

私は 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 で別のクエリを実行できることはわかっていますが、以前に実行したクエリで既に取得できるデータを取り戻すためだけに、データベースに別のヒットが発生します。その上で私に与えます:OrderProductProduct1.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 つのクエリで取得できます。そのクエリを作成して、それに関連するデータのみを取得する方法はありますか?

編集 いくつかの点を明確にする必要があると感じています。明確になっていないことを申し訳ありません:

  1. 一部の製品は公開されており、購入する必要がないため、照会してOrderProductいませんが、それでもそれらをリストする必要があり、それらは照会によって返されませんOrderProduct

  2. 私が期待している結果は、製品のリストとその注文データ (ある場合) です。JSON では、次のようになります。

    [{id: 1、注文: 1、有効期限: 2013-03-03、公開: false}、{id: 1、注文: 、有効期限: 、公開: true

ありがとう

4

2 に答える 2

1

OrderProduct のすべてのエントリを Product1 で取得しますが、クエリセットから返されたものだけが必要です。

あなたはどれが欲しいですか?クエリはProductモデルでフィルタリングされているため、返されたクエリセット内のそれぞれに関連付けられているすべてUsersの 、Orders、およびにアクセスできます。OrderProductsProducts

特定OrderProductの が必要な場合は、次のようにフィルタリングしてop = OrderProduct.objects.filter(xxxxx)から、チェーンのモデルにアクセスする必要があります。

op.productop.orderなど

于 2013-03-01T19:02:01.787 に答える
0

メソッドprefetch_relatedを提案したかったのですが、これは Django 1.3 では利用できません。

Dan Hoerst は から選択することについては正しいですOrderProductが、それでもデータベースに必要以上にヒットします。select_relatedメソッドを使用してこれを停止できます。

>>> from django.db import connection
>>> len(connection.queries)
0
>>> first_result = OrderProduct.objects.select_related("order__user", "product")
...               .filter( order__status="completed",
...                        order__user__pk=2 )[0]
>>> len(connection.queries)
1
>>> name = first_result.order.user.name
>>> len(connection.queries)
1
>>> product_name = first_result.product.name
>>> len(connection.queries)
1
于 2013-03-01T19:16:12.727 に答える