атрибут queryset общих представлений API REST django - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь понять общие представления API django rest framework, документация говорит мне, что, переопределяя методы общих представлений, мне не следует напрямую обращаться к атрибуту queryset, а вместо этого обращаться к функции get_queryset(), потому чтопо-видимому, атрибут queryset оценивается только один раз, что делает get_queryset() по-другому?Обновляется ли когда-либо атрибут queryset?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Для дальнейшего расширения исходный код скажет вам правду.

    assert self.queryset is not None, (
        "'%s' should either include a `queryset` attribute, "
        "or override the `get_queryset()` method."
        % self.__class__.__name__
    )

    queryset = self.queryset
    if isinstance(queryset, QuerySet):
        # Ensure queryset is re-evaluated on each request.
        queryset = queryset.all()
    return queryset
  • Сначала он проверяет, определен ли набор запросов
  • Во-вторых, он проверяет,указанный набор запросов является экземпляром класса Queryset Джанго
  • В-третьих, он переоценивает (делает запрос к базе данных) набор запросов и устанавливает результаты
  • В-четвертых, он возвращает результаты

Предупреждение об непосредственном использовании self.queryset заключается в том, что результаты оцениваются при кэшировании, поэтому дальнейшие ссылки на это значение не будут актуальными в отличие от использования self.get_queryset ().

0 голосов
/ 25 июня 2018

для простых представлений, атрибут queryset поможет вам быстро начать работу.Но в реальной жизни, как правило, у нас есть разрешения для моделей, например, по умолчанию queryset для пользователя будет отфильтрован набор запросов на основе request.user.Метод get_queryset станет

def get_queryset(self):
    return self.model.objects.filter(user=self.request.user)

. Вышеупомянутый метод get_queryset является просто примером настоящего реального дизайна API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...