まずget_object()
、スラッグ値を URL デコードするために、ビューのメソッドをオーバーライドしています (値にスラッシュが含まれているため、URL エンコードが必要です)。
class MyDetail(generics.RetrieveUpdateAPIView):
def get_object(self, queryset=None):
...
slug = unquote(self.kwargs.get(self.slug_url_kwarg, None))
そのため、URL のスラッグ値は URL エンコードされていますが、モデルのデータはエンコードされていません。(もっといい方法があるかもしれませんので、教えてください。)
とにかく、これは GET が正しいレコードを見つけるという点でうまくいくようです。ただし、PUT を実行しようとすると、シリアライザーのメタクラスのread_only_fields
メンバーに含まれているにもかかわらず、フィールドが URL エンコードされたバージョンで更新されます。
問題はmixins.py 行 152UpdateModelMixin
の のメソッドにあるようです: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 による新しいリソースの作成をサポートするためにここにあるようです。私のケースを適切に処理していませんか?または、この動作を回避するために私がすべきことはありますか?