URL 在 Django Rest Framework 中带点

URL with dot in Django Rest Framework

我有以下模型,指定了 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 F.C. 然后我去休息 url,我得到:

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

访问

如何在我的序列化 Team 模型中得到一个 url 像:/api/teams/Name.F.C.

首先检查您是否在设置中将 APPEND_SLASH 设置为 True,因为如果没有 - 丢失的斜线(在 URL 的末尾)是一个问题。

其次 - 我认为点不是问题,问题可以是 space - 编码为 %20;

第三 - 这样的 url 看起来很丑 :) 您应该考虑将其更改为某种 slug:Latinos F.C. -> latinos-fc;

如果你这样做(只需在带有 slug 的模型上添加额外的字段 - 这个字段显然应该是唯一的) - 在你的视图中设置 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

现在:

创作:

详情:

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