[英]Django: Filter ListView on Groups / Iterate queryset over list
鑒於一個用戶可以屬於多個組,我想問一下如何在下面的場景中過濾組。
在 Django 我有一個 ListView 顯示產品列表。
我有 5 個用戶:Worker_1、Worker_2、Worker_3、Worker_4、Inspector
Worker_1,Worker_2,屬於“Company_1”
Inspector 沒有超級用戶身份或員工身份,應該被視為屬於兩個組的普通用戶 ['Company_1', 'Company_2']
期望的功能:
Worker_1 在應用程序中注冊自己制造的產品,可以看到 Company_1 制造的所有產品的列表。
Inspector 可以查看來自 Company_1 和 Company_2 的所有產品
然而,在下面的代碼嘗試中,Inspector 看不到任何產品。
由於 Inspector 屬於 ['Company_1', 'Company_2'] 我需要一種方法來根據為產品注冊的組檢查列表中的每個組成員身份。 請注意,下面被簡化為兩個組,但實際上是 x 組和用戶數。
在models.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)))
我希望這會有所幫助,如果它不起作用,請告訴我:)
我想出了一個非常丑陋的解決方案,但現在必須工作。 理想情況下,我需要找出一種動態的方式來表達這一點。 真正的問題是動態構造過濾器並將它們組合起來,特別是與“|”的手動構造。 可能存在更好的解決方案,但現在我找不到它,也找不到它。
class ProductListView(LoginRequiredMixin, ListView):
model = Product
template_name = 'product_list.html'
def get_queryset(self):
queryset = super(ProductListView, self).get_queryset()
f = []
for g in self.request.user.groups.all():
f.append(f'{g}')
d = len(f)
if d == 0:
g = queryset.filter(company__contains=f"")
elif d == 1:
g = queryset.filter(company__contains=f[0])
elif d == 2:
g = queryset.filter(company__contains=f[0]) | queryset.filter(company__contains=f[1])
elif d == 3:
g = queryset.filter(company__contains=f[0]) | queryset.filter(company__contains=f[1]) \
| queryset.filter(company__contains=f[2])
elif d == 4:
g = queryset.filter(company__contains=f[0]) | queryset.filter(company__contains=f[1]) \
| queryset.filter(company__contains=f[2]) | queryset.filter(company__contains=f[3])
elif d == 5:
g = queryset.filter(company__contains=f[0]) | queryset.filter(company__contains=f[1]) \
| queryset.filter(company__contains=f[2]) | queryset.filter(company__contains=f[3]) \
| queryset.filter(company__contains=f[4])
elif d == 6:
g = queryset.filter(company__contains=f[0]) | queryset.filter(company__contains=f[1]) \
| queryset.filter(company__contains=f[2]) | queryset.filter(company__contains=f[3]) \
| queryset.filter(company__contains=f[4]) | queryset.filter(company__contains=f[5])
else:
g = queryset
return g
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.