如何在django rest framework serializer中自定义字段

时间:2017-09-23 08:34:55

标签: python django django-rest-framework serializer

我想在数据库中创建一条新记录,我设置了如下模型:

class FooModel(models.Model)
    subject_key= models.CharField(max_length=2)
    subject= modeels.CharField(max_length=100)

我想要做的是:字段'subject_key'应该由客户端给出,并且使用subject_key,服务器将找到值'subject'并将其放入数据库。

所以我尝试使用ModelSerializer来创建新记录。

class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = FooModel

    def get_subject(self, obj):
        if obj.subject == 'SO':
            return 'Stack Overflow'
        else:
            return 'Nothing in here'

和视图rest api中的主要运行代码是:

class FooView(APIView):
    def post(self, request, *args, **kwargs):
        serializer = FooSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True)
            serializer.save()
            foo = serializer.data

我检查了它在数据库中成功创建了一条新记录,但新记录为NULL,其中包含'subject'列

如何动态设置序列化程序中的字段值?

2 个答案:

答案 0 :(得分:0)

您将序列化程序中的主题字段声明为方法字段,它始终只读(serializermethodfield),您可以重命名您的字段,例如:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = FooModel

    def get_var_subject(self, obj):

通过这种方式,您的序列化程序'subject', 'subject_key', 'var_subject'

中将包含树字段

或者您可以将您的方法添加到模型中并使用to_representation

def to_representation(self, instance):
    representation = super(FooSerializer, self).to_representation(instance)
    representation['subject'] = instance.get_subject()
    return representation

或者使用相关字段的to_representation字段示例,但我希望您可以使用它

或者您需要覆盖save方法

答案 1 :(得分:0)

你可以试试这个

def post(self, request, *args, **kwargs):
        request.data['subject_key'] = request.data['subject']
        serializer = FooSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True)
            serializer.save()
            foo = serializer.data