我的应用将用户映射到公司,因此他们只能看到他们的公司数据,除非用户是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)
答案 0 :(得分:1)
Company.objects.get(id=user.company.id).order_by('-name')
不是有效的操作。 get返回公司对象,而不是查询集
尝试过滤而不是获取
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')
答案 1 :(得分:0)
由于您要将userS映射到公司,因此您需要使用多对多关系,而不是一对多关系。现在您只是声明用户只能关联一家公司,但公司可以关联许多用户。因此,为用户的公司进行过滤是没有意义的。要修复它,你的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)