django-rest-framework - 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 参数返回为空。
知道是否可以在序列化程序中有效地使用我的自定义创建方法?
解决方案
您可以在创建实例之前预处理经过验证的数据
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
推荐阅读
- macos - 如何修复“zsh:找不到命令:vue”?
- ssh - Vagrant:登录没有 ssh 私钥的用户帐户
- rxjs - 订阅 observable 后点击
- python - 如何在两个图像类别(二进制)上重用具有多个图像类别的预训练模型
- c++ - 如何在 NS-3 或 DCE-NS-3 中获取当前数据速率或可用带宽值?
- keras - Keras fit 与 fit_generator 额外的 smaples
- list - 我可以将 Moshi @JsonQualifier 应用于类型参数吗?
- html - 使用 Tika 从文本文件 XML、HTML 等中提取文本
- javascript - 在 routerLink 或浏览器后退按钮之后失去 Materialise javascript 和 jquery 功能
- google-chrome-extension - 如何运行 jQuery if($(this) 语句来发送 browser.runtime.sendMessage?