2016-01-21 61 views
0

我的应用程序将用户映射到公司,所以他们只能看到他们的公司数据,除非用户is_staff能够看到所有数据。Django get_queryset的干式方法

我一遍又一遍地写同样的查询,并且想重构它以使用干法。

问题是没有东西会被返回。没有错误或者

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) 
+1

它不应该是'Company.objects.filter(ID = user.company.id)。 order_by(' - name') '而不是'get()'? – alecxe

+2

另请注意,假设'公司'是用户到公司的FK,'user.company' *是相关公司,所以根本没有必要进行查询。 –

回答

1
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') 
0

既然要映射用户,您将需要使用一个多对多的关系公司,而不是一个不少。现在,您只是指出用户只能关联一个公司,但公司可以关联许多用户。所以为用户公司做一个过滤器是没有意义的。为了解决这个问题,你的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) 
相关问题