Django rest 框架:在传递额外参数的 ModelSerializer 中重写 create()
Django rest framework: override create() in ModelSerializer passing an extra parameter
我正在寻找一种方法来正确覆盖 Django Rest Framework 中 ModelSerializer
序列化程序的默认 .create()
方法以处理额外参数。
在我原来的 Django 模型中,我刚刚覆盖了默认的.save()
方法来管理 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
参数传递给模型 .save()
方法。
如何正确覆盖 OriginalModelSerializer
class 的 .create()
方法以(最终)考虑此 extra
参数?
嗯。这可能不是完美的答案,因为我不知道你想如何传递这个 "extra" (即它通常是表单中的一个额外字段,等等)
您可能想要做的只是将 foo 表示为序列化程序上的一个字段。然后它将出现在 validated_data
中 create
,然后你可以让 create
做类似下面的事情
def create(self, validated_data):
obj = OriginalModel.objects.create(**validated_data)
obj.save(foo=validated_data['foo'])
return obj
您可能想要查看 create 的默认实现,以了解它所做的其他一些事情(例如删除多对多关系等)。
您现在可以在视图集中执行此操作(作为奖励加入用户 ;)):
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__'
我正在寻找一种方法来正确覆盖 Django Rest Framework 中 ModelSerializer
序列化程序的默认 .create()
方法以处理额外参数。
在我原来的 Django 模型中,我刚刚覆盖了默认的.save()
方法来管理 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
参数传递给模型 .save()
方法。
如何正确覆盖 OriginalModelSerializer
class 的 .create()
方法以(最终)考虑此 extra
参数?
嗯。这可能不是完美的答案,因为我不知道你想如何传递这个 "extra" (即它通常是表单中的一个额外字段,等等)
您可能想要做的只是将 foo 表示为序列化程序上的一个字段。然后它将出现在 validated_data
中 create
,然后你可以让 create
做类似下面的事情
def create(self, validated_data):
obj = OriginalModel.objects.create(**validated_data)
obj.save(foo=validated_data['foo'])
return obj
您可能想要查看 create 的默认实现,以了解它所做的其他一些事情(例如删除多对多关系等)。
您现在可以在视图集中执行此操作(作为奖励加入用户 ;)):
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__'