我正在關注 Django Rest Framework 教程(此處為源代碼),我對以下代碼片段有一些疑問:
class ReviewCreate(generics.CreateAPIView):
serializer_class = ReviewSerializer
permission_classes = [IsAuthenticated]
throttle_classes = [ReviewCreateThrottle]
def get_queryset(self):
return Review.objects.all()
def perform_create(self, serializer):
pk = self.kwargs.get('pk')
watchlist = WatchList.objects.get(pk=pk)
review_user = self.request.user
review_queryset = Review.objects.filter(watchlist=watchlist, review_user=review_user)
if review_queryset.exists():
raise ValidationError("You have already reviewed this movie!")
if watchlist.number_rating == 0:
watchlist.avg_rating = serializer.validated_data['rating']
else:
watchlist.avg_rating = (watchlist.avg_rating serializer.validated_data['rating'])/2
watchlist.number_rating = watchlist.number_rating 1
watchlist.save()
serializer.save(watchlist=watchlist, review_user=review_user)
- 在類定義中,
serializer_class宣告了變數;然而在perform_create方法中,serializer是一個論點。鑒于命名的差異,這兩者有什么關系? - 在方法
perform_create中,self.kwargs被參考。但是,我沒有看到傳遞給任何__init__方法或附加到類物件的 kwargs 引數。kwargs 如何/在哪里傳遞給班級?
在這兩種情況下,我只能假設繼承的類 ( generics.CreateAPIView) 有一個將變數__init__分配給的方法。我不知道它如何“監聽” 的子類定義。至于 kwargs,我不知道如何將它傳遞給子類,而無需在其引數中顯式呼叫定義它。serializer_classserializerserializer_class
編輯,Django 中的這個問題 Kwargs沒有回答我的問題——它只是解釋了關鍵字引數是什么。我對他們的名字并不感到困惑,我對他們在這段代碼中不可見但隱含的參考感到困惑。
uj5u.com熱心網友回復:
回答您的第一點,我們必須注意兩點:
首先,該方法
perform_create用于create關聯到的方法CreateModelMixin(參見https://github.com/encode/django-rest-framework/blob/71e6c30034a1dd35a39ca74f86c371713e762c79/rest_framework/mixins.py#L16)。該類CreateAPIView繼承自這個 mixin,也繼承自GenericAPIView(參見https://github.com/encode/django-rest-framework/blob/b1004a47334a0dd1929e6d50b8f7ff6badc959f4/rest_framework/generics.py#L184)。如您所見,create上面提到的方法使用了類perform_create方法,并且那里需要一個序列化器。使用該方法創建物件時,不使用該引數進行定義perform_create會導致錯誤。另外需要注意的是,使用的序列化器來自
get_serializer方法。檢查GenericAPIView(https://github.com/encode/django-rest-framework/blob/b1004a47334a0dd1929e6d50b8f7ff6badc959f4/rest_framework/generics.py#L103)的源代碼,我們可以看到這個方法呼叫get_serializer_class它檢索由定義的序列化程式serializer_class。
總之,如果您不修改任何其他內容,serializer將作為引數傳遞的將是您在serializer_class.
進入第二點,如果您嘗試搜索父類GenericAPIView并繼續搜索這些類繼承的基類,您最終會發現基類View來自django.views.generic. 在那里你會在屬性被初始化的setup方法(https://github.com/django/django/blob/27aa7035f57f0db30b6632e4274e18b430906799/django/views/generic/base.py#L124)中找到。kwargs您還可以在此方法的代碼檔案中看到以下陳述句:
"""Initialize attributes shared by all view methods."""
因此,在我們創建的任何視圖中(如果它具有作為其基類) ,View我們將始終能夠操作self.request和。我希望我能清楚地解釋自己!self.argsself.kwargs
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/465240.html
上一篇:Django:處理用戶名更改
下一篇:為食譜創建Django模型
