Skip to main content
 首页 » 编程设计

python之Django:限制模型数据

2025年05月04日24mfryf

我正在以某种方式进行搜索以限制我可以通过模型获得的查询集。

假设我有以下模型(具有依赖项):

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() 

它应该是不言自明的。如果没有,那就问我。