我有这种模式:
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 }
为什么会这样?
答案 0 :(得分:1)
因为您已要求它提取产品,请求item.product
。
不确定为什么你这样做,因为item.product.__class__
总是一样的。