首先,我重写了视图的get_object()
方法,以便对 slug 值进行 URL 解码(需要 URL 编码,因为该值包含斜杠):
class MyDetail(generics.RetrieveUpdateAPIView):
def get_object(self, queryset=None):
...
slug = unquote(self.kwargs.get(self.slug_url_kwarg, None))
因此,虽然 URL 中的 slug 值是 URL 编码的,但模型中的数据不是。(也许有更好的方法可以做到这一点;请告诉我。)
无论如何,这似乎有效,因为 GET 找到了正确的记录。但是,当我尝试执行 PUT 时,该字段会使用 URL 编码版本进行更新,即使它包含在序列化程序的元类read_only_fields
成员中。
问题似乎出在 mixins.py 第 152 行的UpdateModelMixin
's方法中:pre_save()
def pre_save(self, obj):
...
if pk:
setattr(obj, 'pk', pk)
if slug:
setattr(obj, slug_field, slug)
如https://github.com/tomchristie/django-rest-framework/issues/328中所述,这些似乎是为了支持通过 PUT 创建新资源。它没有正确处理我的案子吗?或者我应该做些什么来规避这种行为?