如何在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) )
解决方法
你写的无效代码里有两处明显问题:
Q(infringer__name__icontains=q|)多了个多余的竖线,属于语法错误;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
相关产品推荐
相关产品推荐

