ViewSets
memiliki metode otomatis untuk mendaftar, mengambil, membuat, memperbarui, menghapus, ...
Saya ingin menonaktifkan beberapa di antaranya, dan solusi yang saya hasilkan mungkin tidak bagus, karena OPTIONS
masih menyatakan yang diizinkan.
Ada ide tentang bagaimana melakukan ini dengan cara yang benar?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
UpdateModelMixin
. Jika Anda ingin menggunakan update tetapi bukan patch, saat ini saya dapat memikirkan dua cara. Anda dapat mengganti metode yang diizinkan dalam tampilan dan menghapus "patch" atau Anda dapat menggantipartial_update
metode dan memanggilhttp_method_not_allowed(request, *args, **kwargs)
. Saya belum menguji ini jadi saya tidak yakin apakah itu berhasilclass SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Anda dapat terus menggunakan
viewsets.ModelViewSet
dan menentukanhttp_method_names
di ViewSet Anda.Contoh
Setelah Anda menambahkan
http_method_names
, Anda tidak akan dapat melakukanput
danpatch
lagi.Jika Anda mau
put
tapi tidak maupatch
, Anda bisa menyimpannyahttp_method_names = ['get', 'post', 'head', 'put']
Secara internal, Tampilan DRF meluas dari Django CBV. Django CBV memiliki atribut yang disebut http_method_names. Jadi, Anda juga dapat menggunakan http_method_names dengan tampilan DRF.
[Shameless Plug]: Jika jawaban ini bermanfaat, Anda akan menyukai rangkaian posting saya di DRF di https://www.agiliq.com/blog/2019/04/drf-polls/ .
sumber
python3
danDjango 1.10
baik-baik saja.mixins.UpdateModelMixin
Meskipun sudah lama untuk posting ini, saya tiba-tiba menemukan bahwa sebenarnya mereka adalah cara untuk menonaktifkan fungsi tersebut, Anda dapat mengeditnya langsung di views.py.
Sumber: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
sumber
Jika Anda mencoba menonaktifkan metode PUT dari kumpulan tampilan DRF, Anda dapat membuat router kustom:
Dengan menonaktifkan metode di router, dokumentasi skema api Anda akan benar.
sumber
Cara menonaktifkan metode "DELETE" untuk ViewSet di DRF
PS Ini lebih dapat diandalkan daripada secara eksplisit menentukan semua metode yang diperlukan, jadi kecil kemungkinannya untuk melupakan beberapa metode penting OPTIONS, HEAD, dll.
PPS secara default memiliki DRF
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
sumber
super
di tingkat kelas, tidak adaself
.Dalam Django Rest Framework 3.xx Anda dapat dengan mudah mengaktifkan setiap metode yang ingin Anda aktifkan
ModelViewSet
, dengan meneruskan kamus keas_view
metode. Dalam kamus ini, kunci harus berisi jenis permintaan (GET, POST, DELETE, dll) dan nilainya harus berisi nama metode yang sesuai (daftar, ambil, perbarui, dll). Misalnya Anda inginSample
model dibuat atau dibaca tetapi Anda tidak ingin model dimodifikasi. Jadi itu berarti Anda inginlist
,retrieve
dancreate
metode untuk diaktifkan (dan Anda ingin orang lain dinonaktifkan.)Yang perlu Anda lakukan adalah menambahkan jalur
urlpatterns
seperti ini:Seperti yang Anda lihat, tidak ada
delete
danput
permintaan di setelan perutean di atas, jadi misalnya jika Anda mengirimput
permintaan ke url, ia akan membalas Anda dengan 405Method Not Allowed
:sumber
Jika Anda berencana untuk menonaktifkan metode put / post / destroy, Anda dapat menggunakan
sumber