多くのフィールドを持つモデル 'MyModel' があり、PATCH メソッドを使用してフィールド 'status' を更新したいと考えています。クラスベースのビューを使用しています。PATCHを実装する方法はありますか?
5 に答える
それは箱から出してサポートされているようです。ブラウザ API で、モデルの詳細ページに移動し、下部のHTML Form
タブの横にある をクリックRaw data
し、ID フィールドと変更するフィールドを除く JSON 文字列からすべてを削除して、 をクリックしますPATCH
。部分的なPATCH
更新が実行されます。
私は を使用しdjangorestframework==3.2.4
ていますが、これを有効にするためにビューセットとシリアライザーに何もする必要はありませんでした。
この例ではstatus_field
、モデルの bool フィールドを更新しています。jquery 2.2.1 を使用しています。に次を追加します<head>
。
<script src="{% static 'my_app/jquery.min.js' %}"></script>
<script>
$(document).ready(function(){
var chk_status_field = $('#status_field');
chk_status_field.click(function(){
$.ajax({url: "{% url 'model-detail' your_rendering_context.id %}",
type: 'PATCH', timeout: 3000, data: { status_field: this.checked }
})
.fail(function(){
alert('Error updating this model instance.');
chk_status_field.prop('checked', !chk_status_field.prop('checked'));
});
});
});
</script>
次に、次のようにし<form>
ます。
<input type="checkbox" id="status_field" {% if your_rendering_context.status_field %}
checked {% endif %} >
チェックボックスの変更を許可し、失敗した場合は元に戻すことにしました。click
ただし、AJAX 呼び出しが成功した場合にのみチェックボックスの値をmousedown
更新するように置き換えることができます。ただし、これにより、接続が遅い場合にチェックボックスを繰り返しクリックする人が増えると思います.
私はしばらくこれに苦労しましたが、ジェネリック ビュー、またはジェネリック ビューとミックスインの組み合わせを使用した非常に簡単な実装です。
汎用更新ビュー (generics.UpdateAPIView) を使用する場合は、次のコードを使用して、要求の種類が PATCH であることを確認してください。
class UpdateUser(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
他には何もありません!
汎用ビュー (generics.GenericAPIView) と組み合わせて更新 mixin (mixins.UpdateModelMixin) を使用している場合は、次のコードを使用して、要求の種類が PATCH であることを確認します。
class ActivateUser(mixins.UpdateModelMixin, generics.GenericAPIView):
serializer_class = UserSerializer
model = User
lookup_field = 'email'
def get_queryset(self):
queryset = self.model.objects.filter(active=False)
return queryset
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
2 番目の例はより複雑で、クエリセットとルックアップ フィールドをオーバーライドする方法を示していますが、注意すべきコードは patch 関数です。