情况是这样的。我有一个有多个用户的应用程序,每个用户都有一个他们所属的组/公司。所有模型上都有一个 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)
