[英]Django Rest Framework: How to pass extra argument to django serializer?
[英]how to pass current authenticated user to django rest framework serializer?
我有一個這樣的模型:
class Professional(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
dummy_text = models.CharField(max_length=300)
像這樣的序列化器:
class ProfessionalSerializer(serializers.ModelSerializer):
class Meta:
model = Professional
fields = '__all__'
和這樣的觀點:
class CreateProfessional(generics.CreateAPIView):
serializer_class = ProfessionalSerializer
問題是,我需要將給定請求的當前經過身份驗證的用戶作為我的序列化程序的用戶傳遞,我收到一個錯誤,因為顯然我的模型中所述用戶字段是必需的,但我找不到優雅的這樣做的方式,我該怎么做?
您可以使用諸如 validate_user 之類的驗證方法並在其中執行以下代碼。
self.context['view'].request.user()
class CreateProfessional(generics.CreateAPIView):
serializer_class = ProfessionalSerializer
def create(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
serializer.save()
class ProfessionalSerializer(serializers.ModelSerializer):
class Meta:
model = Professional
fields = '__all__'
def create(self, validated_data):
user = self.context['request'].user
像這樣你可以得到你當前的用戶
在序列化程序元中將user
設置為read_only_fields
。 這將阻止接受來自有效負載的user
數據。
class ProfessionalSerializer(serializers.ModelSerializer):
class Meta:
model = Professional
fields = '__all__'
read_only_fields = ["user"]
然后,覆蓋視圖類的perform_create(...)
方法
class CreateProfessional(generics.CreateAPIView):
serializer_class = ProfessionalSerializer
def perform_create(self, serializer): serializer.save(user=self.request.user)
我找到了一個很好的方法來做到這一點,我不想返回自定義響應,我會將其交給框架,在我看來,我所做的是以下內容:
def get_serializer(self, *args, **kwargs):
# redefine method to parameterize the serializer
# while leaving the response handling to the
# framework
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
kwargs['context']['user'] = self.request.user
return serializer_class(*args, **kwargs)
在我的序列化程序中:
class EntitySerializer(serializers.ModelSerializer):
class Meta:
model = Entity
fields = '__all__'
extra_kwargs = {'user': {'required': False}}
def create(self, validated_data):
user = self.context['request'].user
entity = Entity.objects.create(user=user, **validated_data)
return entity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.