mysql - Django ORM : How to filter in an annotation with Count() (subquery) without rawsql

标签 mysql django

对于列表查询,我想显示特定网站上特定产品的价格。

我找到了一种使用 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/

相关文章:

mysql - 返回表中某一列中的值多次出现的行

php - Laravel 6 数据库连接错误。用户访问被拒绝

具有多个where条件的MySQL连接查询

Django apache-wsgi 配置问题

django-allauth 再次重定向到注册/登录表单

MySql 数据库一夜之间发生变化

mysql - 将 MySQL 代码转换为 Access SQL

python - 没有名为 django_filters 的模块

django - 如何处理Django中不共享同一个域的前端

python - 如何一键部署django项目和运行环境