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

Posted

技术标签:

【中文标题】注释另一个模型中的字段值出现次数【英文标题】:Annotate count of field value occurances in another model 【发布时间】:2017-05-15 18:39:57 【问题描述】:

使用 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(???))。

【问题讨论】:

查看答案here 【参考方案1】:

好的,我搞定了。

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)

使用合并是因为 user_promocode_counts 得到的是 Nones 而不是零。

【讨论】:

以上是关于注释另一个模型中的字段值出现次数的主要内容,如果未能解决你的问题,请参考以下文章

Django模型南0.7.6迁移问题:表中的任何更改与另一个字段的默认值百分比

Transact-SQL统计某字段中的值第一次出现后的2小时内出现的次数

C语言,查找数组里重复出现的数字;

计算python中一个值相对于另一个值的重新出现次数

从另一个数据帧计算日期之间的出现次数(给定 ID 值)

查询一个值出现的次数大于num,并统计次数,