Django Rest Framework中带有点的URL

时间:2017-01-10 23:43:46

标签: django-models django-rest-framework django-urls

我有以下型号并指定了primary_key=True

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

我的观点:

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属性包含点.时,例如 Latinos FC ,我会转到其他网址,我得到:

enter image description here

我不确定如何在我的视图集中使用lookup_value_regex属性。在this answer中使用了一些基本的正则表达式,但如果我使用它,任何Team对象都可以通过我的序列化Rest API访问。

如何在序列化/api/teams/Name.F.C.模型中获取类似于:Team的网址?

1 个答案:

答案 0 :(得分:1)

首先检查你的设置中是否已将APPEND_SLASH设置为True,因为如果没有 - 缺少斜杠(在URL的末尾)是个问题。

第二 - 我不认为点是一个问题,问题可以是空格编码为%20;

第三 - 这样的网址看起来很丑陋:)你应该考虑把它改成某种slu :: Latinos F.C. - &gt; 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

你能这样做吗?或者你真的需要点?