如何在DRF的CreateModelMixin中传递额外字段至Serializer?
解决方案
要在GenericAPIView结合CreateModelMixin的场景下,给序列化器传递额外字段(比如requester=request.user),核心是重写CreateModelMixin提供的perform_create方法——这个方法是Mixin内部调用serializer.save()的入口,默认只传入验证后的数据,我们可以在这里追加额外参数。
步骤1:重写视图的perform_create方法
直接在你的视图类里重写该方法,把需要传递的字段通过serializer.save()传入:
from rest_framework.generics import GenericAPIView from rest_framework.mixins import CreateModelMixin from .models import Foo from .serializers import FooSerializer class FooCreateView(CreateModelMixin, GenericAPIView): queryset = Foo.objects.all() serializer_class = FooSerializer def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) # 重写perform_create,传递额外字段 def perform_create(self, serializer): serializer.save(requester=self.request.user)
步骤2:在序列化器的create方法中处理字段
你的序列化器create方法可以直接从验证数据中取出传入的requester字段(serializer.save()传入的额外参数会自动合并到validated_data中):
from rest_framework import serializers from .models import Foo class FooSerializer(serializers.ModelSerializer): class Meta: model = Foo fields = ["name", "description"] # 无需包含requester字段 def create(self, validated_data): # 取出额外传入的requester requester = validated_data.pop("requester") # 创建模型实例 foo = Foo.objects.create(requester=requester, **validated_data) return foo
进阶:复用逻辑(符合DRY原则)
如果多个视图都需要传递requester字段,可以封装成自定义Mixin,避免重复代码:
# 自定义Mixin class RequesterCreateMixin: def perform_create(self, serializer): serializer.save(requester=self.request.user) # 视图继承自定义Mixin class FooCreateView(RequesterCreateMixin, CreateModelMixin, GenericAPIView): queryset = Foo.objects.all() serializer_class = FooSerializer def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
这样所有需要传递requester的视图,只需继承这个Mixin即可,完全遵循DRY原则,不用在每个端点重复写序列化器调用逻辑。
内容的提问来源于stack exchange,提问作者Luciano
相关产品推荐
相关产品推荐

