在我的应用程序中,有用户,用户可以互相阻止.我想保存用户执行的每个操作.在一个动作中,一个用户可以对其他用户执行多个禁止操作.这就是操作表具有USER_LIST的原因.现在我想找出其他用户针对特定用户的总数.例如,User_5被其他用户攻击了8次.

models.py

class BanMode(models.Model):
    ban_mode = models.CharField(max_length=10, blank=False, null=False)

class CustomUser(models.Model):
    custom_name = models.CharField(max_length=96, blank=False, null=False)
    custom_id = models.IntegerField(blank=False, null=False)
    
class Action(models.Model):
    taken_by = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=False, null=False)
    ban_mode = models.ForeignKey(BanMode, on_delete=models.PROTECT, blank=False, null=False)
    user_list = models.ManyToManyField(CustomUser, blank=False, null=False, related_name="user_list")

下面的代码successfully找出其他用户(不是唯一的用户)对该用户执行的操作总数.

CustomUser.objects.annotate(banned_by_count=Count('user_list', distinct=False))

但是,我想应用一个过滤器.我想知道其他用户(不是唯一用户)对该用户执行的操作总数(例如BAN_MODE为1的操作).此查询不起作用.

CustomUser.objects.annotate(banned_by_count=Count('user_list', distinct=False, filter=Q(action__ban_mode__ban_mode="BAN"))) 

推荐答案

您可以使用以下方式进行过滤:

from django.db.models import Count, Q

CustomUser.objects.annotate(
    banned_by_count=Count(
        'user_list', distinct=False, filter=Q(user_list__ban_mode__ban_mode='BAN')
    )
)

否则,您将过滤用户是在哪里执行操作,而不是"受害者".

Python相关问答推荐

Pandas使用过滤器映射多列

键盘.任务组

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

在函数内部使用eval(),将函数的输入作为字符串的一部分

仅从风格中获取 colored颜色 循环

理解Python的二分库:澄清bisect_left的使用

Python中的嵌套Ruby哈希

有症状地 destruct 了Python中的regex?

什么相当于pytorch中的numpy累积ufunc

Pandas - groupby字符串字段并按时间范围 Select

如何使用数组的最小条目拆分数组

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

try 将一行连接到Tensorflow中的矩阵

如何获得每个组的时间戳差异?

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

未知依赖项pin—1阻止conda安装""

如何保持服务器发送的事件连接活动?

OpenCV轮廓.很难找到给定图像的所需轮廓

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

Python—为什么我的代码返回一个TypeError