1

まず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 による新しいリソースの作成をサポートするためにここにあるようです。私のケースを適切に処理していませんか?または、この動作を回避するために私がすべきことはありますか?

4

1 に答える 1