Django rest框架:在ModelSerializer中覆盖create(),传递一个额外的参数

时间:2015-06-04 17:06:11

标签: python django django-rest-framework override

我正在寻找一种方法来正确地替换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个参数?

2 个答案:

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