对于列表查询,我想显示特定网站上特定产品的价格。
我找到了一种使用 RawSQL 来做到这一点的方法,这是我以前从未做过的事情。我是否忽略了什么?
queryset = Price.objects.all()
site_annotations = {}
for site in Site.objects.all():
site_annotations['num_prices_{}'.format(site.name)] = RawSQL(
'SELECT COUNT(id) '
'FROM `product_siteprice` '
'WHERE `product_siteprice`.`price_id` = `product_price`.`id` '
'AND site_id=%s', [site.pk]
)
queryset = queryset.annotate(**site_annotations)
编辑
我的模型看起来像这样简化:
class Site(Model):
name = models.CharField(_('display name'), max_length=50)
class Price(Model):
name = models.CharField()
class SitePrice(Model):
price = models.ForeignKey(Price)
site = models.ForeignKey(Site)
现在我想要的表是:
Product | Nr of prices on Site A | Nr of prices on Site B |
--------|------------------------|------------------------|
Iphone | 6 | 3 |
Xperia | 42 | 66 |
我想对价格数量进行排序和过滤,所以这就是我需要注释的原因。
注意,如果您不了解其余上下文,“价格”这个名称会有点误导,在这种情况下,它更像是一个产品
最佳答案
据我了解,您只需要过滤相关网站上的价格,然后获取对象的数量即可。
Price.objects.filter(site_price__site_id=site.pk).count()
尽管您可能只想删除网站价格模型并将其替换为多对多字段
关于mysql - Django ORM : How to filter in an annotation with Count() (subquery) without rawsql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41957659/