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

如何在Django视图中按登录用户组过滤Infringement查询集?

Django视图添加用户组过滤条件问题

我是Python新手,希望在现有Django视图的查询中添加额外过滤条件,仅展示与登录用户所属组匹配的Infringement记录。当前视图已实现按name或infringer__name进行模糊查询,尝试添加groups过滤但未成功。

现有视图代码

@login_required(login_url='login')
def home(request):
   q= request.GET.get('q') if request.GET.get('q') != None else '' 
   infs= Infringement.objects.filter(Q(name__icontains=q) |
                                     Q(infringer__name__icontains=q)
                                                                                
                                    )

Infringement模型代码

class Infringement (models.Model):

    name = models.CharField(max_length=200)
    link = models.CharField(null=True, blank=True, max_length=200)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    infringer = models.ForeignKey(Infringer, on_delete=models.SET_NULL,null=True)
    player = models.ForeignKey(Player, on_delete=models.SET_NULL,null=True)
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL,null=True)
    status = models.ForeignKey(Status, on_delete=models.SET_NULL,null=True)
    groups = models.ForeignKey(Group, on_delete=models.CASCADE,default=1)
    
    class Meta:
        ordering = ['-updated', '-created']

尝试过的无效代码

infs= Infringement.objects.filter(Q(name__icontains=q) |
                                     Q(infringer__name__icontains=q|) 
                                       (groups=request.user.groups)                                         
                                      )

解决方法

你写的无效代码里有两处明显问题:

  1. Q(infringer__name__icontains=q|)多了个多余的竖线,属于语法错误;
  2. request.user.groups是用户组的管理器对象,不是单个Group实例,而你的Infringement模型中groups是ForeignKey(关联单个组),需要用__in来匹配用户所属的任意组。

修改后的正确视图代码:

from django.db.models import Q
from django.contrib.auth.decorators import login_required

@login_required(login_url='login')
def home(request):
    q = request.GET.get('q', '')  # 简化默认值写法
    infs = Infringement.objects.filter(
        # 模糊查询条件和组过滤条件同时满足
        (Q(name__icontains=q) | Q(infringer__name__icontains=q)) &
        Q(groups__in=request.user.groups.all())
    )
    # 后续返回响应的代码...

如果业务场景中用户只会属于一个组,也可以用groups=request.user.groups.first(),但用__in的写法兼容性更强,能覆盖用户多组的情况。

内容的提问来源于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 22:45:28