为了安全和速度,迭代用户所属的报告组的最佳方法

2024-09-28 22:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于用户(Django内置)、报表、报表组和报表组成员的模型。用户可以创建属于单个报表组的报表。用户只能为其所属的报告组(因此为ReportGroupMembers)编写报告

在我的观点(如下)中,我只想显示用户拥有的或是其成员的组,并有一个装饰器,或者以某种方式轻松防止人们向他们不属于的组写信。ReportGroups可以关联密码(用于加入组)。我不太确定设计/实现这一点并使其良好扩展的最佳方法。如果我不需要它来扩展,我只需要循环遍历它们所属的组

视图:

owned_group_list = ReportGroup.objects.filter(user=request.user.id)
member_group_list = ReportGroupMember.objects.filter(user=request.user.id)
group_list = owned_group_list | member_group_list
return render(request, 'dashboard/main.html', {'group_list': group_list})

这在上面不起作用,因为它抱怨“无法在两个不同的基础模型上组合查询”

型号:

class ReportGroup(models.Model):
    group_name = models.CharField(max_length=64, blank=False, null=False)
    description = models.TextField(blank=True, null=True)
    avatar = models.ImageField(upload_to='profiles', null=True, blank=True)
    user = models.ForeignKey(User)

    class Meta:
        managed = True
        db_table = 'report_group'

    def __str__(self):
        return 'Group: %s - User: %s' % (self.group_name, self.user.username)


class Report(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=264, unique=False)
    users = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    group = models.OneToOneField(ReportGroup, on_delete=models.CASCADE)

    class Meta:
        managed = True
        db_table = 'intelligence_report'

    def __str__(self):
        return '%s (%s)' % (self.name, self.users.username)


class ReportGroupMembers(models.Model):
    groups = models.ForeignKey(ReportGroup, on_delete=models.CASCADE)
    users = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    class Meta:
        managed = True
        db_table = 'report_group_membership'

    def __str__(self):
        return 'Group: %s - User: %s' % (self.groups, self.users)

Tags: 用户nameselffalsetruereturn报表models
1条回答
网友
1楼 · 发布于 2024-09-28 22:40:13

我想出来了:

owned_group_list = ReportGroup.objects.filter(user=request.user.id)
member_group = ReportGroupMember.objects.filter(user_id=request.user.id)
group_list = ReportGroup.objects.filter(
    Q(id__in=member_group.values_list('group_id')) | Q(id__in=owned_group_list.values_list('id')))

return render(request, 'dashboard/main.html', {'group_list': group_list})

相关问题 更多 >