python - Django:在组上过滤 ListView / 在列表上迭代查询集
问题描述
鉴于一个用户可以属于多个组,我想问一下如何在以下场景中过滤组。
在 Django 中,我有一个 ListView 显示产品列表。
- 我有两个组:Company_1、Company_2。
我有 5 个用户:Worker_1、Worker_2、Worker_3、Worker_4、Inspector
Worker_1、Worker_2 属于“Company_1”
- Worker_3,Worker_4,属于“Company_2”
- “检查员”可以检查两家公司的所有产品
Inspector 没有超级用户身份或员工身份,应该被视为属于两个组 ['Company_1', 'Company_2'] 的普通用户
所需功能:
Worker_1 在应用程序中注册了自己制造的产品,可以看到 Company_1 制造的所有产品的列表。
Inspector 可以查看 Company_1 和 Company_2 的所有产品
然而,在下面的代码尝试中,Inspector 看不到任何产品。
由于 Inspector 属于 ['Company_1', 'Company_2'] 我需要一种方法来检查列表中的每个组成员资格与注册产品的组。请注意,以下被简化为两组,但实际上是 x 个组和用户。
在模型.py
from django.contrib.auth.models import User
class Product(models.Model):
worker = models.ForeignKey(User, blank=True, on_delete=models.CASCADE)
company = models.CharField(max_length=100, null=True, blank=True)
def save(self, *args, **kwargs):
self.company = list(self.worker.groups.all().values_list('name', flat=True))
super(Product, self).save(*args, **kwargs)
在views.py中
class ProductListView(LoginRequiredMixin, ListView):
model = Product
template_name = 'product_list.html'
def get_queryset(self):
queryset = super(ProductListView, self).get_queryset()
return queryset.filter(company__contains=list(self.request.user.groups.all().values_list('name', flat=True)))
解决方案
由于您对检查器的定义很明确,因此我们可以在 get_queryset 函数中添加一些条件。这是一个伪代码:
from django.contrib.auth.models import User, Group
class ProductListView(LoginRequiredMixin, ListView):
model = Product
template_name = 'product_list.html'
def get_queryset(self):
Company1 = Group.objects.get(name='Company1')
Company2 = Group.objects.get(name='Company2')
inspectors = User.objects.filter(groups=Company1 and groups=Company2).distinct()
if self.request.user in inspectors:
return queryset.filter(company=Company1 or company=Company2).distinct().values_list('name', flat=True)))
return queryset.filter(company__contains=list(self.request.user.groups.all().values_list('name', flat=True)))
我希望这会有所帮助,如果它不起作用,请告诉我:)
推荐阅读
- javascript - 修改 Strapi 中的默认查找服务
- javascript - 如何使用 reducer 函数更改属性的值
- asp.net-core-3.1 - .NET Core 3.1,Devar for Oracle,首次调用数据库非常慢
- netlogo - 当一个循环停止其他所有程序时,如何让其他程序运行
- javascript - cypress 登录后等待重定向
- amazon-web-services - 弹性beantalk http重定向https不起作用
- javascript - 如果源是 https,应该如何为对 localhost 的请求配置 HttpHeaders?
- xcode - bash 在 macOS Catalina 上找不到命令“debug-safari”
- tidymodels - 如何在 tidymodels 中指定偏最小二乘模型
- python - 在 Airflow 中,如何使用上下文将参数传递给 on_success_callback 函数处理程序?