Django Rest Framework 在 url 中使用点
Django Rest Framework using dot in url
使用 DRF(Django Rest 框架),我的一个模型将 IP 地址作为主键。
class VTE(models.Model):
ipaddr = models.CharField(primary_key=True, max_length=16)
...
问题是 PK 包含点,当组装 REST URL 时,点被 DRF 解释为格式化选项,而不是作为主键的一部分。查看下面的错误以及匹配的模式。
Request URL: http://192.168.10.121/api/vtes/172.25.128.29/
Using the URLconf defined in vtfx.urls, Django tried these URL patterns, in this order:
...
^api/ ^$ [name='api-root']
^api/ ^\.(?P<format>[a-z0-9]+)$ [name='api-root']
^api/ ^vtes/$ [name='vte-list']
^api/ ^vtes/\.(?P<format>[a-z0-9]+)$ [name='vte-list'] <---- HERE
^api/ ^vtes/(?P<pk>[^/.]+)/$ [name='vte-detail']
^api/ ^vtes/(?P<pk>[^/.]+)/\.(?P<format>[a-z0-9]+)$ [name='vte-detail']
...
使用点作为主键的一部分是错误的吗? 如果不是,它与 DRF 路由器组装 URL 的方式有点不兼容。
有什么DRF方法可以解决吗?
更新:上下文
api.py:
class VTESerializer(serializers.ModelSerializer):
class Meta:
model = models.VTE
class VTEViewSet(viewsets.ModelViewSet):
queryset = models.VTE.objects.all()
serializer_class = VTESerializer
permission_classes = (permissions.AllowAny,)
urls.py:
router = routers.DefaultRouter()
router.register(r'vtes', api.VTEViewSet)
urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...
)
首先,可以在 url 中使用 .
(点)。看
Can . (period) be part of the path part of an URL?
其次,问题不在 format
选项中,而是在用于捕获主键的正则表达式中,它排除了 .
(点)和 /
(斜杠)默认。
(?P<pk>[^/.]+) <--- This excludes the dots in the IP Address
可以使用 lookup_value_regex
在 ViewSet 中覆盖正则表达式。这是解决问题的新ViewSet:
class VTEViewSet(viewsets.ModelViewSet):
lookup_value_regex = '[0-9.]+' #Just add this line & change your Regex if needed
queryset = models.VTE.objects.all()
serializer_class = VTESerializer
permission_classes = (permissions.AllowAny,)
使用 DRF(Django Rest 框架),我的一个模型将 IP 地址作为主键。
class VTE(models.Model):
ipaddr = models.CharField(primary_key=True, max_length=16)
...
问题是 PK 包含点,当组装 REST URL 时,点被 DRF 解释为格式化选项,而不是作为主键的一部分。查看下面的错误以及匹配的模式。
Request URL: http://192.168.10.121/api/vtes/172.25.128.29/
Using the URLconf defined in vtfx.urls, Django tried these URL patterns, in this order:
...
^api/ ^$ [name='api-root']
^api/ ^\.(?P<format>[a-z0-9]+)$ [name='api-root']
^api/ ^vtes/$ [name='vte-list']
^api/ ^vtes/\.(?P<format>[a-z0-9]+)$ [name='vte-list'] <---- HERE
^api/ ^vtes/(?P<pk>[^/.]+)/$ [name='vte-detail']
^api/ ^vtes/(?P<pk>[^/.]+)/\.(?P<format>[a-z0-9]+)$ [name='vte-detail']
...
使用点作为主键的一部分是错误的吗? 如果不是,它与 DRF 路由器组装 URL 的方式有点不兼容。
有什么DRF方法可以解决吗?
更新:上下文
api.py:
class VTESerializer(serializers.ModelSerializer):
class Meta:
model = models.VTE
class VTEViewSet(viewsets.ModelViewSet):
queryset = models.VTE.objects.all()
serializer_class = VTESerializer
permission_classes = (permissions.AllowAny,)
urls.py:
router = routers.DefaultRouter()
router.register(r'vtes', api.VTEViewSet)
urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...
)
首先,可以在 url 中使用 .
(点)。看
Can . (period) be part of the path part of an URL?
其次,问题不在 format
选项中,而是在用于捕获主键的正则表达式中,它排除了 .
(点)和 /
(斜杠)默认。
(?P<pk>[^/.]+) <--- This excludes the dots in the IP Address
可以使用 lookup_value_regex
在 ViewSet 中覆盖正则表达式。这是解决问题的新ViewSet:
class VTEViewSet(viewsets.ModelViewSet):
lookup_value_regex = '[0-9.]+' #Just add this line & change your Regex if needed
queryset = models.VTE.objects.all()
serializer_class = VTESerializer
permission_classes = (permissions.AllowAny,)