我正在以某种方式进行搜索以限制我可以通过模型获得的查询集。
假设我有以下模型(具有依赖项):
Company
|- Section
| |- Employee
| |- Task
| `- more models...
|- Customer
| |- Contract
| |- Accounts
| `- other great models ...
`- some more models...
应该注意的是,我的真实模型要深得多,而且与业务无关。
使用上下文处理器,我添加了一个公司实例来请求:
def magic_view(request):
request.company # is a instance of Company model
现在我的问题是,将对 Company 的子模型的访问权限限制为 company 的请求实例的最佳方法是什么?
我可以让它像 task = Task.objects.get(pk=4,section__task=task),但如果我的模型结构越来越深,这是一个糟糕的方法。
编辑:我可以给彼此模型一个公司的外键,但这是存储冗余关系的好做法吗? 编辑 2: 不,不是。参见 Is it bad to use redundant relationships? .
请您参考如下方法:
我是这样解决的:
首先,我创建了一个 CurrentCompanyManager。
class CurrentCompanyManager(models.Manager):
def __init__(self,field,*args,**kwargs):
super(CurrentCompanyManager,self).__init__(*args,**kwargs)
self.__field_name = field
def on(self,company):
return self.filter( **{ self.__field_name + '__id__exact':company.id } )
然后我将管理器添加到我需要的所有模型中。
class Employee(models.Model):
# some fields and relationships
objects = CurrentCompanyManager("section__company")
class Accounts(models.Model):
# some fields and relationships
objects = CurrentCompanyManager("customer__company")
现在我可以轻松地限制 View 中的模型数据。
def magic_view(request):
Employee.objects.on(request.company).all()
它应该是不言自明的。如果没有,那就问我。
