2017-02-12 5 views
0

Я делаю отдых api моего проекта django для мобильного клиента.Структура Django REST. Получить объект по уникальному url

У меня есть эта модель и структуру API для Категории объектов:

models.py

class Category(models.Model): 
    title = models.CharField(max_length=200, verbose_name="Title") 
    url = models.CharField(max_length=200, verbose_name="Url") 

апи/serializers.py

class CategoryDetailSerializer(ModelSerializer): 

    class Meta: 
     model = Category 
     fields = [ 
      'id', 
      'title', 
      'url' 
     ]  

апи/views.py

class CategoryViewSet(viewsets.ModelViewSet): 
    queryset = Category.objects.all() 
    serializer_class = CategoryDetailSerializer 

и апи/urls.py

urlpatterns = [ 
    url(r'^(?P<pk>\d+)/$', CategoryViewSet.as_view({'get': 'retrieve'}), name='detail'), 
] 

Чтобы получить Категория объект Я использую запрос GET для my_server_url/api/categories/[pk]/

Вопрос в том, как получить объект с его url поле (которое является уникальным). например вот так: my_server_url/api/categories/category_1/ Возможно ли это с рамой отдыха?

Или, может быть, я должен сначала получить карту [pk]: [url] объектов, а затем получить pk по URL-адресу и передать ее существующему методу запроса ..?

ответ

0

Вы можете установить lookup_field в представлении.

class CategoryViewSet(viewsets.ModelViewSet): 
    queryset = Category.objects.all() 
    serializer_class = CategoryDetailSerializer 
    lookup_field = 'url' 

Вы также должны изменить URL-адрес регулярное выражение:

urlpatterns = [ 
    url(r'^(?P<url>[-\w]+)/$', CategoryViewSet.as_view({'get': 'retrieve'}), name='detail'), 
] 

Однако я бы рекомендовал хранить уникальное поле как поле пробкового https://docs.djangoproject.com/en/1.10/ref/models/fields/#slugfield так что вы уверить это является допустимым URL.

+0

Спасибо! Оно работает. –