Переопределение get queryset() в Django DetailView
у меня есть две модели, город и государство с государством, являющимся иностранным отношением города.Мой url CityDetailView построен как:
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 (), чтобы отфильтровать только модели города в одном состоянии, но кажется, это не работает, что странно, потому что мой CityListView похож, но работает нормально. Любые мысли о том, чего мне не хватает, будут оценены.
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
Я получал ошибку в функции get_context_data, потому что я не фильтровал список городов там не на основном объекте представления.