从序列化程序创建实例而不将其持久保存到db

wim*_*wim 8 python django django-rest-framework

创建django模型的上下文中工作:

# Creates potato and saves a row to db
spud = Potato.objects.create(...)

# Also creates a potato instance, but doesn't hit db yet.
# Could call `spud.save()` later if/when we want that.
spud = Potato(...)
Run Code Online (Sandbox Code Playgroud)

工厂男孩,我们也有这个Djangoism的类比

# Returns a saved instance
spud = PotatoFactory.create()

# Returns an instance that's not saved
spud = PotatoFactory.build()
Run Code Online (Sandbox Code Playgroud)

休息框架 v3.3.2中,我找不到类比.可能吗?

serializer = PotatoSerializer(data=...)

# creates the instance and saves in db
serializer.create(serializer.validated_data)
Run Code Online (Sandbox Code Playgroud)

我可以写自己的东西,像这样:

class PotatoSerializer:
    ...
    def build(self, validated_data):
        return self.Meta.model(**validated_data)
Run Code Online (Sandbox Code Playgroud)

但是不要把它放在基本的序列化器上是一种拖累,我错过了什么?

kni*_*ite 1

来自https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py#L811-L846(省略注释):

def create(self, validated_data):
    raise_errors_on_nested_writes('create', self, validated_data)

    ModelClass = self.Meta.model

    info = model_meta.get_field_info(ModelClass)
    many_to_many = {}
    for field_name, relation_info in info.relations.items():
        if relation_info.to_many and (field_name in validated_data):
            many_to_many[field_name] = validated_data.pop(field_name)

    try:
        instance = ModelClass.objects.create(**validated_data)
Run Code Online (Sandbox Code Playgroud)

序列化器create()方法是模型的一个相当薄的包装器create()方法的一个相当薄的包装器。

坏消息是你是对的,没有仅内存序列化器快捷方式:

class PotatoSerializer:
    ...
    def build(self, validated_data):
        return self.Meta.model(**validated_data)
Run Code Online (Sandbox Code Playgroud)

好消息是您可以省去中间人并直接调用模型:

Potato(**validated_data)
Run Code Online (Sandbox Code Playgroud)