我正在以一种限制可以通过模型获得的查询集的方式进行搜索。
假设我有以下模型(具有依赖项):
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)
,但如果我的模型结构越来越深,这是一个坏方法。
Edit:我可以给彼此模型一个公司的外键,但是这是存储冗余关系的好做法吗?Edit 2:不,不是。看使用冗余关系不好吗? https://stackoverflow.com/questions/3347008/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")
现在我可以轻松限制视图中的模型数据。
def magic_view(request):
Employee.objects.on(request.company).all()
它应该是不言自明的。如果没有,那就问我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)