Django按用户组过滤外键关系

问题描述

我正在尝试按分配的用户组过滤任务中的活动(活动列表)。

TaskActivityModel.objects.filter(activity__workCenter=request.user.groups)

这给了我TypeError: Field 'id' expected a number

当我将filter参数修改request.user.groups.id时,我得到了AttributeError: 'ManyRelatedManager' object has no attribute 'id'。我想念什么?

每个活动都分配有一个组。用户可以是多个组中的一个。这可能是问题吗

TaskActivityModel

class TaskActivityModel(models.Model):
    task = models.ForeignKey(TaskModel,on_delete=models.PROTECT)
    activity = models.ForeignKey(ActivityModel,on_delete=models.PROTECT)
    startTime = models.DateTimeField(default=timezone.Now)
    finishTime = models.DateTimeField(null=True)

ActivityModel

class ActivityModel(models.Model):
    activityName = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    workCenter = models.ForeignKey(Group,on_delete=models.PROTECT)
    history = HistoricalRecords()

解决方法

所以这正是您所说的。由于该请求,用户可以处于多个组中。user.groups返回ManyRelatedManager。要获取用户组的所有ID,您必须查询该经理以获取所有对象。您可以通过以下方式执行此操作:request.user.groups.all()

由于返回的值将是一个数组,因此您必须在ORM查询中使用__in,以便它检查workCenter是否在用户组中。像这样:

TaskActivityModel.objects.filter(activity__workCenter__in=request.user.groups.all())

您可以在此处详细了解Django中的多对多关系:https://docs.djangoproject.com/en/3.1/topics/db/examples/many_to_many/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...