serialization - DRF 序列化器 is_valid() == True,但 .save() 不持久化模型对象
问题描述
我的列表、检索和销毁操作按预期工作。
HTTP 响应 = 201 '创建'
"POST /api/atoms/?uid=04d38ad99b2a4353a18438c651eac5ab&created_at=2019-05-12T22:30:04.725089Z&updated_at=2019-05-12T22:30:07.053148Z&charge=1&mass=2 HTTP/1.1" 201 152
在视图集中
class AtomViewSet(viewsets.ViewSet):
def create(self, request):
serializer = AtomSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
# True
serializer.save()
# self.perform_create(serializer) # doesn't work
# self.node.save() # doesn't work
# headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED,) # headers=headers
这是我跑步时得到的serializer.save()
<Atom: {'uid': '04d38ad99b2a4353a18438c651eac5qq', 'created_at': datetime.datetime(2019, 5, 12, 22, 30, 4, 725089, tzinfo=<UTC>), 'updated_at': datetime.datetime(2019, 4, 12, 22, 30, 7, 53148, tzinfo=<UTC>), 'charge': 0.0, 'mass': 1.0}>
尽管保存的输出令人鼓舞,但奇怪的是资源并没有保存到数据库中。
我正在对非模型模型使用 ViewSets 和自定义序列化程序。
AttributeError: 'AtomViewSet' object has no attribute 'perform_create'
串行器
class AtomSerializer(serializers.Serializer):
uid = serializers.CharField()
created_at = serializers.DateTimeField()
updated_at = serializers.DateTimeField()
charge = serializers.FloatField()
mass = serializers.FloatField()
def create(self, validated_data):
return Atom(**validated_data)
def update(self, instance, validated_data):
for field, value in validated_data.items():
setattr(instance, field, value)
return instance
我现在正在查看我的序列化程序。不确定创建和更新应该包含什么
http://www.cdrf.co/3.1/rest_framework.serializers/Serializer.html
解决方案
在您AtomSerializer
中,您实际上并没有保存对象,只是在内存中创建或修改它的实例,用于save()
将实例持久保存到数据库。
def create(self, validated_data):
atom = Atom(**validated_data)
atom.save()
# Alternative you could use atom = Atom.objects.create(**validated_data)
return atom
同样对于您的更新方法,您需要在修改后保存对象。
def update(self, instance, validated_data):
for field, value in validated_data.items():
setattr(instance, field, value)
instance.save() # <-- saving the instance after setattr
return instance
推荐阅读
- c# - ChatMessages.Add(message) 未命中
- asp.net - 我应该将 docker 与应用服务一起使用,而不是直接使用应用服务吗?
- php - 在 PHP 中使用正则表达式捕获和编辑部分字符串
- typescript - 将键的值转换为类型中的可能值?
- python - scipy.opimize.minimize 因有序解向量的约束而失败
- firebase - 方法 'placemarkFromCoordinates' 没有为类型 'Geolocator' 定义。尝试将名称更正为现有方法的名称
- java - Spring Boot REST 获取 HTTPConnectionURL 的参数
- flask - 如何将标头添加到烧瓶中的所有路由?
- oracle - Oracle APEX - PopUp LOV 上的 OnChange 事件不起作用
- cookies - 仅在 chrome 中过滤掉的 Cookie