我正在寻找一种方法来正确地替换Django Rest Framework中.create()
序列化程序的默认ModelSerializer
方法,以处理额外的参数。
在我原来的Django模型中,我刚刚覆盖了管理.save()
param的默认extra
方法。现在也可以通过以下方式调用.save()
:.save(extra = 'foo')
。
我必须在原始Django模型上创建ModelSerializer
映射:
from OriginalModels.models import OriginalModel
from rest_framework import serializers
class OriginalModelSerializer(serializers.ModelSerializer):
# model fields
class Meta:
model = OriginalModel
但是这样我就无法将extra
param传递给模型.save()
方法。
如何正确覆盖.create()
课程的OriginalModelSerializer
方法以考虑(最终)此extra
个参数?
答案 0 :(得分:13)
嗯。这可能不是一个完美的答案,因为我不知道你想如何传递这个“额外”(即通常是一个额外的字段,等等)
您可能想要做的只是将foo表示为序列化程序中的字段。然后它会出现在validated_data
的{{1}}中,然后您可以create
执行以下操作
create
您可能希望查看create的默认实现(尽管它可以删除多对多关系等)。
答案 1 :(得分:3)
您现在可以在视图集中执行此操作(作为奖励向用户提供;)):
class OriginalModelViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows OriginalModel classes to be viewed or edited.
"""
serializer_class = OriginalModelSerializer
queryset = OriginalModel.objects.all()
def perform_create(self, serializer):
user = None
if self.request and hasattr(self.request, "user"):
user = self.request.user
serializer.save(user=user, foo='foo')
这样,序列化程序就可以保持通用性,即:
class OriginalModelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OriginalModel
fields = '__all__'