Переопределите объект djangos object.all () данными запроса - PullRequest
0 голосов
/ 27 июня 2011

Я хочу переопределить поведение objects.all() конкретной модели на основе информации, которая находится внутри сеанса, и я не знаю, как получить данные сеанса в этот момент

Спасибо

РЕДАКТИРОВАТЬ Еще немного объяснения того, что / почему я делаю это.У нас есть проект, но мы хотим применить фильтр к тому, что видит пользователь, в зависимости от того, во что он вошел.Так что это нормально для того, чтобы влиять на работу "all ()".Наш проект уже собран, и мы модифицируем его, поэтому нам не нужно проходить и изменять все objects.all() и добавлять в запрос.Надеюсь, это прояснит ситуацию

1 Ответ

0 голосов
/ 27 июня 2011

Вы должны сделать метод на пользовательском менеджере для этого:

from django.db import models

class MyManager(models.Manager):
    def all(self, session=None):
        if session is None:
            return self.all()
        else:
            return self.filter(.....)

class MyModel(models.Model):
    # fields go here
    objects = MyManager()

Хотя это, вероятно, не рекомендуемый подход, поскольку он меняет поведение all(), что может привести к неожиданным последствиям для других частей вашего приложения! В качестве альтернативы вы можете либо добавить НОВЫЙ метод в менеджер для этой цели, либо выполнить дополнительную фильтрацию в представлении:

# code in the view
qs = MyModel.objects.all()
if session....:
    qs = qs.filter(...)

Но вам всегда нужно будет передать необходимые данные в ваш метод фильтрации! Учтите, что метод также может быть вызван из местоположения, которое не имеет доступа к данным запроса / сеанса (например, оболочки), поэтому хорошая архитектура требует этого!

...