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)。凉爽的。但是现在我想要那个产品的过期时间,但是如果我打电话Product1.orderproduct_set.all(),我会得到OrderProductwith的每一个条目Product1,但我只想要从我的查询集中返回的那个。我知道我可以在 OrderProducts 上运行一个不同的查询,但这将是对数据库的另一个打击,只是为了带回我之前运行的查询已经可以获取的数据。.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

  2. 我期望的结果是一个产品列表,以及他们的订单数据(如果他们有的话)。在 JSON 中,它看起来有点像这样

    [{id: 1, order: 1, expiration: 2013-03-03, public: false}, {id: 1, order: , expiration: , public: true

谢谢

4

2 回答 2

1

我将使用 Product1 获取 OrderProduct 的每个条目,但我只想要从我的查询集中返回的那个。

你只想要哪个“一个”?您的查询正在模型上进行过滤,因此与返回的查询集中的每个相关联的Product所有UsersOrders和都将是可访问的。OrderProductsProducts

如果你想要一个特定OrderProduct的,那么你应该过滤为op = OrderProduct.objects.filter(xxxxx)然后访问链上的模型,如下所示:

op.product,op.order等。

于 2013-03-01T19:02:01.787 回答
0

我会建议方法prefetch_related,但这在 Django 1.3 中不可用。

Dan Hoerst 关于选择 from 是正确的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 回答