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)
但是不要把它放在基本的序列化器上是一种拖累,我错过了什么?
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)
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |