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
现在:
创作:
详情:
你能这样做吗?或者你真的需要这些点?
我有以下模型,指定了 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
现在:
创作:
详情:
你能这样做吗?或者你真的需要这些点?