Skip to main content
 首页 » 编程设计

python之如何透明地在 Django 应用程序中强制执行域完整性

2025年05月04日30落叶无声

情况是这样的。我有一个有多个用户的应用程序,每个用户都有一个他们所属的组/公司。所有模型上都有一个 company 字段,这意味着在数据库中的每个表中都有一个相应的 company_id 列。我想透明地强制执行,当用户试图访问任何对象时,他们总是被限制在他们的“域”内的对象,例如他们的团体/公司。我可以遍历每个查询并添加一个显示 .filter(company=user.company) 的过滤器,但我希望有更好的方法可以在较低级别进行操作,因此它对任何人都是透明的编码更高级别的逻辑。

有没有人有这方面的经验和/或可以向我们指出如何处理这个问题的良好资源?我假设这是一个相当普遍的要求。

请您参考如下方法:

你可以这样做:

from django.db import models 
from django.db.models.query import QuerySet 
 
class DomainQuerySet(QuerySet): 
    def applicable(self, user=None): 
        if user is None: 
            return self 
        else: 
            return self.filter(company=user.company) 
 
class DomainManager(models.Manager): 
    def get_query_set(self): 
        return DomainQuerySet(self.model) 
    def __getattr__(self, name): 
        return getattr(self.get_query_set(), name) 
 
class MyUser(models.Model): 
    company = models.ForeignKey('Company') 
 
    objects = DomainManager() 
 
MyUser.objects.applicable(user) 

由于我们使用的是查询集,因此查询是可链接的,因此您还可以:

MyUser.objects.applicable().filter(**kwargs)