簡體   English   中英

Django Dry方法獲取get_queryset

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM