在Django中为两个不同类结合Annotation与Filtering
统计登录用户每条侵权记录对应的市场数量
需求说明
仅针对登录用户,查询并统计每一条Infringement(侵权记录)对应的Marketplace(市场)数量,需要结合以下两段代码的逻辑:
mar_count = Marketplace.objects.annotate(infringement_count=Count('infringement')) inf=Infringement.objects.filter(groups__user=request.user)
遇到的问题:找到的示例仅适用于同一模型类,但这里使用的是两个独立的Django模型类,本人是Django初学者。
解决方案
直接从登录用户的侵权记录出发,链式调用过滤和统计逻辑即可,不用分开执行两段代码。具体实现取决于两个模型的关联方式:
情况1:Infringement与Marketplace是多对多关联
假设你的Infringement模型定义了多对多字段关联Marketplace:
class Infringement(models.Model): # 其他字段 marketplaces = models.ManyToManyField(Marketplace) groups = models.ForeignKey(Group, on_delete=models.CASCADE)
统计代码如下:
# 过滤当前登录用户的侵权记录,并统计每条记录关联的市场数量 user_infringements = Infringement.objects.filter( groups__user=request.user ).annotate( marketplace_count=Count('marketplaces') )
情况2:Marketplace通过外键关联Infringement
如果是Marketplace模型有外键指向Infringement(设置了related_name):
class Marketplace(models.Model): # 其他字段 infringement = models.ForeignKey( Infringement, on_delete=models.CASCADE, related_name='marketplaces' )
统计代码同样适用,因为related_name='marketplaces'让Infringement可以反向关联对应的Marketplace集合:
user_infringements = Infringement.objects.filter( groups__user=request.user ).annotate( marketplace_count=Count('marketplaces') )
使用方式
遍历查询集即可获取每条侵权记录及其对应的市场数量:
for inf in user_infringements: print(f"侵权记录ID: {inf.id}, 关联市场数量: {inf.marketplace_count}")
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

