Использовать метод 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.
это сработало для меня.
спасибо