mysql - 带有 select .extra() 的 Django 数据集给出非常慢的 mysql 查询

标签 mysql django django-models dataset django-1.5

我有两个模型:

class PromoCodeGroup(models.Model):
    updated_at = models.DateTimeField(auto_now=True, verbose_name=__("Last updated at"))
    updated_by = models.ForeignKey(User, blank=True, null=True, verbose_name=__("Last created by"))
    bonus = models.IntegerField()
    affilate = models.ForeignKey(Affilate)

class PromoCode(models.Model):
    code = models.CharField(verbose_name=__("Promo code"), unique=True, max_length=100)
    promo_code_group = models.ForeignKey(PromoCodeGroup, null=False)
    is_used = models.BooleanField(default=False)

我想在 PromoCodeGroup 上进行一次查询,并希望计算具有两个条件(全部,并且 is_used=True)的 PromoCodes。所以我用 .extra 来创建子查询:

PromoCodeGroup.objects.annotate(codes_count=Count('promocode')) \
        .extra(select={'used_codes_count': "SELECT COUNT(*) as used_codes\
    FROM `promocodes_promocode` as pc2 \
            WHERE `is_used` = 1\
    AND pc2.promo_code_group_id=`promocodes_promocodegroup`.`id`"})

理论上它应该工作得相当顺利,当我执行查询时它很慢而且失败了。当我在没有注释的情况下运行代码时,它运行得更快。可能是查询末尾的 group by 造成的。

我的问题是如何在 Django ORM 中使用计数来防止 GROUP BY 查询。

最佳答案

我解决了用 .extra 替换 annotate 的问题。

关于mysql - 带有 select .extra() 的 Django 数据集给出非常慢的 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17467956/

相关文章:

mysql - 使用 union 时如何组合具有不同列数的 SELECT 语句?

mysql - 如何使用 Django 处理数百个相同的数据库?

django - django 上的 memcache 不起作用

django - 多对多和一对多关系

python - 类型错误 : "ModelBase is not iterable"

javascript - Ajax、PHP 和 MySQL 以及在页面中附加数据

php - 修改插入更新

django - 在 Django 中建模递归关系的正确方法

MySQL 统计记录频率

python - ModelMultipleChoiceField 上的 Django 多值