使用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)
我需要一个查询集,在一个或两个数据库请求中执行此操作:
promocodes = PromoCode.objects.all()
for p in promocodes:
p.assigned_times = UserPromoCode.objects.filter(promo_code__code=p.code).count()
问题是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()
我想它应该像PromoCode.objects.annontate(assigned_times = Count(???))。
答案 0 :(得分:0)
好的,我让它运转了。
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)
使用Coalesce是因为user_promocode_counts得到Nones而不是零。