Как я могу ограничить свой выбор внешнего ключа Django с помощью свойства, хранящегося в сеансе Django - PullRequest
1 голос
/ 25 октября 2010

У меня есть небольшое приложение, которое я реализую с помощью django, и у меня небольшая проблема. Я пытаюсь ограничить набор запросов для моих отношений в приложении определенным свойством. Теперь выгода в том, что точное значение свойства не известно, пока пользователь не войдет в приложение. пример - ограничение набора комментариев конкретной компанией пользователя, и компания определяется только тогда, когда пользователь входит в систему. Я не знаю, как найти мой текущий сеанс за пределами представления django. Любая помощь приветствуется. Спасибо

Вот пример модели из моего приложения

class Tax(commons.models.EntityBase):
    name = models.CharField(blank=False, max_length=150)
    percentage_value = models.DecimalField(max_digits=4, decimal_places=2)
    notes = models.TextField(blank=True, null=True)
    auto_apply = models.NullBooleanField()
    aggregated_tax = models.NullBooleanField()

    def __unicode__(self):
        return self.name

Каждая сущность наследует от абстрактного класса EntityBase, который обладает свойством company. Я хочу отфильтровать каждый запрос от диспетчера запросов так, чтобы они возвращали только сущности, чья компания равна компании в сеансе.

Ответы [ 3 ]

1 голос
/ 25 октября 2010

Совершенно нормально передавать свойство сеанса, пользователя или компанию или еще что-то, другим функциям в других частях вашей системы.

Например:

def view(request):
    user = request.user
    filtered_stuff = my_filter_function(..., user = user)

my_filter_function может фильтровать аргумент или передавать аргумент другим функциям.

0 голосов
/ 26 октября 2010

Чтобы добавить к ответу Джека, ваш CustomQuerySetManager будет выглядеть примерно так:

class CustomQuerySetManager(models.Manager):
    def get_query_set(self):
        return self.model.QuerySet(self.model)
    def __getattr__(self, attr, *args):
        return getattr(self.get_query_set(), attr, *args)

Я предпочитаю этот метод, а не пишу методы менеджера, потому что он позволяет вам иметь цепные функции, поэтому вы можете сделать:

Foo.objects.for_user(user).filter(...)
0 голосов
/ 26 октября 2010

Лучший способ, который я нашел, это использовать пользовательский QuerySet и Менеджер для вашей модели.Принятый ответ на этот вопрос , должен помочь вам начать с этой части.В вашем QuerySet вы можете настроить метод (я предпочитаю называть его for_user), который фильтрует ваши объекты для вас:

class Foo(models.Model):
    ts = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, blank=True, null=True)
    due_date = models.DateField(auto_now=False)
    objects = CustomQuerySetManager()
    class QuerySet(QuerySet):
        def for_user(self, user):
            return self.filter(user=user)

Оттуда ваше представление довольно простое:*

def view(request):
    user = request.user
    mylist = Foo.objects.for_user(user).filter(due_date__lte=datetime.date.today())
...