这是情况。我有一个拥有多个用户的应用程序,每个用户都有一个他们所属的组/公司。所有模型都有一个company
字段,这意味着数据库中的每个表都有一个对应的company_id
列。我想透明地强制执行,当用户试图访问任何对象时,它们总是被限制在其“域”内的对象,例如,他们的团队/公司。我可以浏览每个查询并添加一个说.filter(company=user.company)
的过滤器,但我希望有一个更好的方法可以在较低的级别进行,因此对于编写更高级别逻辑的人来说它是透明的。
有没有人有这方面的经验和/或可以指出我们如何处理这个问题的良好资源?我认为这是一个相当普遍的要求。
答案 0 :(得分:1)
你可以这样做:
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)