Переопределение get_queryset() в Django DetailView

У меня есть две модели: City и State, где State является отношением ForeignKey к City.My CityDetailView URL-адрес строится как:

r'^state/(?P<state>[-\w]+)/city/(?P<slug>[-\w]+)/$'

Мой CityDetailView, вызываемый указанным выше URL-адресом:

class CityDetailView(DetailView):
    model = City
    context_object_name = 'city'
    template_name = 'location/city_detail.html'

    def get_queryset(self):
        state = get_object_or_404(State, slug__iexact=self.kwargs['state'])
        return City.objects.filter(state=state)

    def get_context_data(self, **kwargs):
        context = super(CityDetailView, self).get_context_data(**kwargs)
        city = City.objects.get(slug__iexact=self.kwargs['slug'])
        context['guide_list'] = Guide.objects.filter(location=city).annotate(Count('review'), Avg('review__rating'))
        return context

Модель «Мой город» имеет уникальные имена для каждого города. Если я попытаюсь получить доступ к городу, который встречается в двух состояниях, я получаю сообщение об ошибке, что get() возвращает более одного города. Я пытаюсь переопределить метод get_queryset(), чтобы отфильтровать только модели City в одном состоянии, но, похоже, он не работает, что странно, потому что мой CityListView похож, но работает нормально. Любые мысли о том, что мне не хватает, будут оценены.


person thesteve    schedule 18.06.2011    source источник


Ответы (2)


Вам необходимо переопределить метод get_object в DetailView, чтобы сделать это.

Что-то вроде этого должно делать:

class CityDetailView(DetailView):
    model = City
    context_object_name = 'city'
    template_name = 'location/city_detail.html'

    def get_object(self):
        state = get_object_or_404(State, slug__iexact=self.kwargs['state'])
        return self.model.objects.filter(state=state)

    def get_context_data(self, **kwargs):
        context = super(CityDetailView, self).get_context_data(**kwargs)
        cities = self.object
        context['guide_list'] = Guide.objects.filter(location=cities).annotate(Count('review'), Avg('review__rating'))
        return context
person Valder Gallo    schedule 24.12.2013
comment
в чем разница между get_queryset() и get_object() в их работе? - person rammanoj; 26.09.2018

Я получал ошибку в функции get_context_data, потому что я не фильтровал список городов не в основном объекте просмотра.

person thesteve    schedule 19.06.2011
comment
ха-ха, действительно, было бы неплохо не забыть отфильтровать список в соответствующем порядке :). чтобы получить города в штате, вы должны отфильтровать список городов по штату. вы даже могли бы многое сделать с параметрами URL, если бы вы могли / хотели сделать это таким образом. - person eusid; 10.08.2012