我有一个模型,其主键是TextField。这是我的问题的简约再现:
型号:
class Filename(models.Model):
path = models.TextField(primary_key=True)
序列化器:
class FilenameSerializer(ModelSerializer):
class Meta:
model = Filename
fields = '__all__'
查看:
class FilenameViewSet(ModelViewSet):
queryset = Filename.objects.all()
serializer_class = FilenameSerializer
我正在使用DefaultRouter
作为URL。这里是问题:如果我发送了
与{"path":"test"}
一起使用POST /filename/
,我可以按照您的期望使用GET /filename/test/
来完美地检索对象。但是,如果我POST /filename/
之类的{"path":"c:\\test"}
之类的东西,我希望GET /filename/c%3A%5Ctest/
或GET /filename/c%3A%5C%5Ctest/
是获得它的正确方法,但是这些都不起作用。有人知道发生了什么吗?
更新:网络服务器日志显示Not Found: /filename/c:\test
,因此有时会对其进行正确解码。也许是网址正则表达式问题?
答案 0 :(得分:1)
问题通常与编码的URL无关,而特别是点(%2E)。默认情况下,DefaultRouter()与点不匹配。可以通过在ViewSet中设置lookup_value_regex
属性来修改此行为。
class FilenameViewSet(ModelViewSet):
queryset = Filename.objects.all()
serializer_class = FilenameSerializer
lookup_value_regex = '[^/]+'
答案 1 :(得分:0)
嘿,您必须定义lookupfield,您可以将get_object更改字符串格式覆盖为标准文本
class FilenameViewSet(ModelViewSet):
queryset = Filename.objects.all()
serializer_class = FilenameSerializer
lookup_field = 'path'
def get_object(self):
try:
from urllib import unquote
except ImportError:
from urllib.parse import unquote
path = unquote(kwarhs['path'))
return self.get_queryset.get(path=path)
答案 2 :(得分:0)
如果我正确地回答了您的问题。您的问题是json格式。 在特殊字符之前添加转义字符\可以解决您的问题。
请参见以下链接: How to escape special characters in building a JSON string?