Django ORM:为什么会有这些额外的查询?

时间:2014-09-14 10:17:16

标签: python django orm

我有这种模式:

class Product(models.Model):
    pass

class Price(models.Model):
    [...]
    product = models.ForeignKey(Product, related_name='prices')

class Spec(models.Model):
    [...]
    product = models.ForeignKey(Product, related_name='specs')

并查看:

class ProductsList(ListView):
    [...]
    def get_context_data(self, **kwargs):
        [...]
        products_ids_list = [some list of products ids from search]
        prices = models.Price.objects.filter(product__id__in=products_ids_list).order_by('-id')

        prices = { '%s!%s' % (item.product.__class__.__name__, item.product_id): item for item in prices }

我希望在简化代码时我没有破坏任何东西;)

出于某些原因,我无法在这里使用select_related / prefetch_related(现在不重要,我想知道那里发生了什么)。

现在,我已经缓存了价格,一切正常,但是django-toolbar显示我在那里创建了一个价格字典,我查询每个价格(它取得产品):

SELECT * FROM `products` WHERE `products`.`id` = 10

Connection: default

/products/views.py in get(106)
  response = super(ProductsList, self).get(request, *a, **b)
/products/views.py in get_context_data(79)
  prices = { '%s!%s' % (item.product.__class__.__name__, item.product_id): item for item in prices }
/products/views.py in <dictcomp>(79)
  prices = { '%s!%s' % (item.product.__class__.__name__, item.product_id): item for item in prices }

为什么会这样?

1 个答案:

答案 0 :(得分:1)

因为您已要求它提取产品,请求item.product

不确定为什么你这样做,因为item.product.__class__总是一样的。