Переопределите объект djangos object.all() данными запроса
Я хочу изменить поведение objects.all()
конкретной модели на основе информации, которая находится в сеансе, и я не знаю, как получить данные сеанса в этой точке
Спасибо
РЕДАКТИРОВАТЬ Просто немного больше объяснения того, что / почему я делаю это. У нас есть проект, но мы хотим применить фильтр к тому, что видит пользователь, в соответствии с тем, во что он вошел. Так что это нормально для того, чтобы влиять на работу "all()". Наш проект уже построен, и мы модифицируем его, поэтому нам не нужно проходить через него и изменять все objects.all()
и добавить в запрос. Надеюсь, это прояснит ситуацию
1 ответ
Вы должны сделать метод на собственном менеджере для того что:
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(...)
Но вам всегда нужно будет передавать необходимые данные в ваш метод фильтра! Учтите, что метод также может быть вызван из местоположения, которое не имеет доступа к данным запроса / сеанса (например, оболочки), поэтому хорошая архитектура требует этого!