注释另一个模型中字段值出现的计数

Dan*_*kin 1 python django annotations

使用 Django 1.11。这些是我的模型:

class UserPromoCode(models.Model):
    promo_code = models.ForeignKey(PromoCode, related_name="user_promo_code")

class PromoCode(models.Model):
    code = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)

我需要一个查询集,在一个或两个数据库请求中执行以下操作:

promocodes = PromoCode.objects.all()
for p in promocodes:
   p.assigned_times = UserPromoCode.objects.filter(promo_code__code=p.code).count()
Run Code Online (Sandbox Code Playgroud)

问题是 PromoCode.code 不是唯一的,所以我不能做PromoCode.objects.annontate(assigned_times=Count('user_promo_code'))以下类似的事情:

promocodes = PromoCode.objects.all()
for p in promocodes:
   p.assigned_times = p.user_promo_code.count()
Run Code Online (Sandbox Code Playgroud)

我想它应该是类似 PromoCode.objects.annontate(assigned_times=Count(???)) 的东西。

Dan*_*kin 6

好的,我成功了。

from django.db.models import OuterRef, Subquery
from django.db.models.functions import Coalesce

user_promo_codes = UserPromoCode.objects.filter(promo_code__code=OuterRef('code')).values('promo_code__code')
user_promocode_counts = upks.annotate(c=Count('*')).values('c')

PromoCode.objects.annotate(assigned_times=Coalesce(Subquery(user_promocode_counts), 0)
Run Code Online (Sandbox Code Playgroud)

使用 Coalesce 是因为 user_promocode_counts 得到 None 而不是零。