我有两个模型:
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(全部,并且 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 查询。