Как прозрачно обеспечить целостность домена в приложении Django? - PullRequest
2 голосов
/ 26 февраля 2011

Вот ситуация. У меня есть приложение с несколькими пользователями, и у каждого пользователя есть группа / компания, к которой они принадлежат. Во всех моделях есть поле company, означающее, что в каждой таблице в БД есть соответствующий столбец company_id. Я хочу прозрачно обеспечить, чтобы, когда пользователь пытается получить доступ к какому-либо объекту, он всегда ограничивался объектами в своем «домене», например, их группа / компания. Я мог бы пройтись по каждому запросу и добавить фильтр, который говорит .filter(company=user.company), но я надеюсь, что есть лучший способ сделать это на более низком уровне, так что он прозрачен для любого, кто кодирует логику более высокого уровня.

Есть ли у кого-нибудь опыт с этим и / или мы можем указать нам хороший ресурс о том, как подойти к этому? Я предполагаю, что это довольно распространенное требование.

1 Ответ

1 голос
/ 26 февраля 2011

Вы можете сделать что-то вроде этого:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...