Использовать метод get queryset () или задать переменную queryset?

эти две части кода идентичны при первом румянце:

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'
    queryset = Poll.active.order_by('-pub_date')[:5]

и

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        return Poll.active.order_by('-pub_date')[:5]

есть ли разница между ними? И если это так:

какой подход лучше? Или при установке queryset переменная лучше, чем переопределить get_queryset способ? И наоборот.

5 ответов


в вашем примере, переопределение queryset и get_queryset имеют такой же эффект. Я бы немного предпочел настройку queryset потому что это менее многословно.

при установке queryset, queryset создается только один раз, при запуске сервера. С другой стороны,get_queryset метод вызывается для каждого запроса.

что это значит get_queryset полезно, если вы хотите настроить запрос динамически. Например, можно возвращать объекты, принадлежащие текущему пользователь:

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that belong to the current user"""
        return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]

еще один пример, где get_queryset полезно, когда вы хотите фильтровать на основе вызываемого, например, вернуть сегодняшние опросы:

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that were created today"""
        return Poll.active.filter(pub_date=date.today())

если вы пытались сделать то же самое, установив queryset, потом date.today() будет вызываться только один раз, когда представление было загружено, и представление будет отображать неправильные результаты через некоторое время.

class IndexView(generic.ListView):
    # don't do this!
    queryset = Poll.active.filter(pub_date=date.today())

другие ответы пропустили важный подтекст того факта, что queryset атрибут вычисляется при запуске процесса. Потому что вы не просто создаете queryset, вы на самом деле для нарезки это, запрос будет оценка в этой точке. Это означает, что на данный момент Вы получите только 5 лучших опросов, и они не будут обновляться, даже если вы создадите еще один, пока процесс не будет перезапущен.

это именно тогда, когда вы должны быть используя get_queryset().


атрибут queryset используется внутренне, всегда используйте метод (вам часто придется выполнять пользовательские запросы на основе запроса или сеанса vars, например)


Model и queryset очень похожи, но значение queryset при условии переопределяет значение model.

модель-это тип объекта, отображаемого в этом представлении.

переопределение get_queryset управляет тем, что конкретных случаях этот вид отображается (пример: последние 5 созданных экземпляров)

из документации Django:

модель:

модель, для которой будет отображаться это представление. Указание модель = Фу!--15--> практически аналогично задание queryset = Foo.объекты.all (), где объекты обозначает менеджер по умолчанию Foo.

queryset:

набор запросов, представляющий объекты. если предоставлено, значение queryset заменяет значение, предоставленное для model.

get_queryset:

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


внутри класса просто включить

Class MyViewSet(GenericAPIView):

    queryset = ''

Если вы нигде не используете queryset.

это сработало для меня.

спасибо