Django rest framework:重写ModelSerializer中的create(),并传递一个额外的参数

2024-09-24 22:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来正确地覆盖Django Rest框架中用于处理额外参数的ModelSerializer序列化程序的默认.create()方法。

在我最初的Django模型中,我刚刚重写了用于管理extra参数的默认.save()方法。现在.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类的.create()方法来(最终)考虑这个extra参数?


Tags: django方法from模型import参数modelsave
2条回答

现在,您可以在视图集中执行此操作(将用户作为奖励加入;):

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__'

嗯。这可能不是一个完美的答案,因为我不知道你想如何把这个“额外的”输入(例如,它是一个正常形式的额外字段,等等)

您可能想做的只是将foo表示为序列化程序上的一个字段。然后它将出现在validated_datacreate中,然后您可以让create执行如下操作

def create(self, validated_data):
    obj = OriginalModel.objects.create(**validated_data)
    obj.save(foo=validated_data['foo'])
    return obj

您可能希望查看create的默认实现,以了解它所做的其他一些事情(例如删除多对多关系等)。

相关问题 更多 >