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

时间:2011-02-26 15:38:44

标签: python django

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

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

1 个答案:

答案 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)