You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:30:55