Смоделируйте множественный поиск полей в Django 1.5

у меня есть модель

class ModelName(models.Model):
    type = models.ForeignKey(AnotherModel)
    slug = models.SlugField(editable=False)

    class Meta:
        unique_together = (('type', 'slug'),)

    @models.permalink
    def get_absolute_url(self):
        return ('model_detail', (), {'type': self.type.slug, 'slug': self.slug})

и URL

urlpatterns = patterns('',
    url(r'^(?P<type>[-\w]+)/(?P<slug>[-\w]+)/$', ModelDetailView.as_view(), name='detail'),
)

и подробный вид

class ModelDetailView(DetailView):
    model = MyModel
    template_name = 'detail.html'

но я получаю исключение MultipleObjectsReturned, потому что слаг не уникален. Я хочу, чтобы URL-адреса были /type/slug/, поэтому модель может содержать две записи с одним и тем же слагом, но разными типами, поэтому URL-адреса могут быть /1/slug/ и /2/slug/ с разными результатами. Как я могу указать модели использовать как тип, так и слаг в качестве поиска, а не только слаг?


person user2232982    schedule 20.04.2013    source источник


Ответы (1)


Вам не нужно «указывать модели» использовать поля типа и строки — это представление на основе класса, которое вы должны переопределить.

Я предлагаю вам переопределить метод get_queryset, чтобы ограничить набор запросов объектами правильного типа. Альтернативой может быть переопределение метода get_object.

class ModelDetailView(DetailView):
    model = MyModel
    template_name = 'detail.html'

    def get_queryset(self):
        """
        Restrict queryset to objects of the correct type
        """
        return MyModel.objects.filter(type_id=self.kwargs['type'])

См. документацию Django по динамической фильтрации для более подробной информации.

person Alasdair    schedule 20.04.2013