Django干接近get_queryset

时间:2016-01-21 13:51:42

标签: python django

我的应用将用户映射到公司,因此他们只能看到他们的公司数据,除非用户是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)

2 个答案:

答案 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)