簡體   English   中英

如何將當前經過身份驗證的用戶傳遞給 django rest 框架序列化程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM