首页 > 解决方案 > Djangorestframework,我如何使用带有自定义字段的序列化程序,我想为创建方法传递这些字段?

问题描述

假设我有以下内容:

class EntityManager(Manager):
 def create(label, entity_type, **kwargs):
    ... do stuff with label and entity type
    obj = super().create(**cleanedupkwargs)
    obj.addstuffwithlabel(label)
    return obj

class Entity(Model):
 somefields...

 objects = EntityManager()

这个没问题,我可以打电话Entity.objects.create(label='foo', entity_type=my_entity_type, other_params=foo)

问题是我现在正在使用序列化程序,我试过这个

class EntityBareboneSerializer(serializers.ModelSerializer):
label = serializers.SerializerMethodField()
entity_type = serializers.SerializerMethodField()

class Meta:
    model = Entity
    fields = [
        'id',
        'label',
        'entity_type',
    ]

def validate_label(self, label):
    return label

def validate_entity_type(self, entity_type):
    return entity_type

def create(self, validated_data):
    # do stuff with label and entity type
    return Entity.objects.create(**validated_data)

问题是当 is_valid 被调用时,validated_data 参数返回为空。

知道是否可以在序列化程序中有效地使用我的自定义创建方法?

标签: django-rest-framework

解决方案


您可以在创建实例之前预处理经过验证的数据

    def create(self, validated_data):
        label = validated_data.pop("label", "some_default_value")
        entity_type = validated_data.pop("entity_type", "some_default_value")
        obj = Entity.objects.create(**validated_data)
        obj.addstuffwithlabel(label)
        return obj

推荐阅读