Переопределите объект 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(...)

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

Другие вопросы по тегам