2017-01-10 2 views
0

У меня есть следующие модели с primary_key=True указано:URL с точкой в ​​Django Rest Framework

class Team(models.Model): 
    name = models.CharField(
     max_length=64, 
     primary_key=True, 
    ) 
    ... other fields 

Когда я сериализации эту модель, я делаю следующее:

class TeamSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Team 
     fields = ('url', 'name',) # and another fields 

Мой Viewset:

class TeamViewSet(viewsets.ModelViewSet): 
    lookup_value_regex = '[-\w.]' 
    queryset = Team.objects.all() 
    serializer_class = TeamSerializer 
    filter_fields = ('name',) # and another fields 

Мой urls.py:

router = routers.DefaultRouter() 
router.register(r'teams', TeamViewSet) 

urlpatterns = [ 
    url(r'^api/', include(router.urls)), 

    # I am not sure if this url is right. I repeat of include(router.urls) 
    url(r'^api/teams/(?P<name>[-\w.]+)/', include(router.urls)), 

    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 
] 

Затем, когда я создаю Team объект с name атрибутом, содержащих точками ., например латиноамериканцы F.C. и я иду на отдых URL, я получаю:

enter image description here

Я не уверен в том, как использовать атрибут lookup_value_regex в моем режиме просмотра. В this answer используется с некоторым основным регулярным выражением, но если я его использую, любой объект Team доступен через мой сериализованный Rest API.

Как я могу получить URL-адрес как: /api/teams/Name.F.C. в моей сериализованной модели Team?

ответ

1

Прежде всего проверьте, что вы установили APPEND_SLASH в True в своих настройках, потому что если нет - недостающая косая черта (в конце URL-адреса) является проблемой.

Во-вторых - я не думаю, что точка является проблемой, проблема может быть пространственно-кодированной как% 20;

В-третьих - такие URL-адреса выглядят просто уродливыми :) Вы должны рассмотреть вопрос об изменении его на какие-то пули: Latinos F.C. ->latinos-fc;

Если вы это сделаете (просто добавьте дополнительное поле на модели с помощью пули - это поле должно быть очевидно уникальным) - настройте lookup_field на ваш взгляд - это решит вашу проблему.

Рассмотрим пример:

views.py

class SomeViewSet(viewsets.ModelViewSet): 
    queryset = SomeModel.objects.all() 
    serializer_class = SomeSerializer 
    lookup_field = 'slug_name' 

serializers.py

class SomeSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = SomeModel 
     fields = ('id', 'name', 'slug_name') 
     read_only_fields = ('slug_name',) 

    def to_internal_value(self, data): 
     ret = super(SomeSerializer, self).to_internal_value(data) 
     ret['slug_name'] = slugify(ret['name']) 
     return ret 

models.py

class SomeModel(models.Model): 
    name = models.CharField(max_length=100) 
    slug_name = models.SlugField(unique=True, max_length=100) 

urls.py

router.register(r'teams', SomeViewSet, base_name='teams') 

urlpatterns = router.urls 

А теперь:

создания:

enter image description here

детали:

enter image description here

Вы можете сделать это таким образом? Или вам действительно нужны точки?

+0

У меня есть «APPEND_SLASH = True» в моих настройках, но неудобно, что у меня есть то, что мой url не принимает точку '.' Идея, что я хочу, - это то, что в имени какой-то команды принимаем'. 'как часть строки. Поле пули принимает точки '.' действительно? Должен ли я объявлять поле слияния как primary_key для отображения в моем URL-адресе? ИЛИ уникально? – bgarcial

+0

Нет, SlugField содержит только буквы, цифры, символы подчеркивания или дефисы. Но я не понимаю, зачем вам так много точек? Я бы предложил просто пропустить точки. Вам не нужно использовать поле пули в качестве первичного ключа, но вы можете, если хотите. Уникально, потому что вы хотите сделать поиск в этом поле. – opalczynski

+0

Иногда название объекта Team может быть Barcelona F.C. Это означает, что пользователи могут вводить аббревиатуру F.C. от имени объекта Team. Я хочу разрешить этот случай. – bgarcial

Смежные вопросы