选择.extra()的Django数据集给出了非常慢的mysql查询

时间:2013-07-04 10:28:19

标签: 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上进行一次查询,并希望计算PromoCodes有两个contidions(all,并且is_used = True)。所以我用.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中使用count来阻止GROUP BY查询。

1 个答案:

答案 0 :(得分:0)

我解决了用.extra替换注释。