[英]Django Dry approach to get_queryset
我的應用程序將用戶映射到公司,因此除非用戶is_staff可以查看全部,否則他們只能查看其公司數據。
我一遍又一遍地編寫相同的查詢,並希望將其重構為使用干式方法。
問題是什么也沒有返回。 也沒有錯誤
models.py
class Company(models.Model):
...
class Site(models.Model):
company = models.ForeignKey(Company)
...
class UserProfile(AbstractUser):
company = models.ForeignKey(Company)
...
views.py
def get_company(user):
if user.is_staff:
company = Company.objects.all().order_by('-name')
else:
company = Company.objects.get(id=user.company.id).order_by('-name')
return company
class DashboardList(ListView):
model = Company
template_name = 'sites/dashboard.html'
paginate_by = 25
def get_queryset(self):
return get_company(self.request.user)
Company.objects.get(id=user.company.id).order_by('-name')
不是有效的操作。 獲取返回公司對象,而不是查詢集
嘗試過濾而不是獲取
Company.objects.filter(id=user.company.id).order_by('-name')
沒事的。 所以你可以這樣重構
def get_company(user):
query = {}
if not user.is_staff:
query['id'] = user.company.id
return Company.objects.filter(**query).order_by('-name')
由於要將用戶映射到同伴,您將需要使用多對多關系,而不是一對多關系。 現在,您只是在說一個用戶只能關聯一個公司,但是一個公司可以關聯多個用戶。 因此,對用戶的公司進行篩選沒有任何意義。 要修復它,您的models.py應該是:
class Company(models.Model):
...
class UserProfile(AbstractUser):
companies = models.ManyToManyField(Company)
...
和您的view.py:
def get_companies(user):
if user.is_staff:
companies = Company.objects.all()
else:
companies = user.companies.all()
return companies.order_by('-name')
class DashboardList(ListView):
model = Company
template_name = 'sites/dashboard.html'
paginate_by = 25
def get_queryset(self):
return get_company(self.request.user)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.