这可能看起来像一个愚蠢的问题,但我真的觉得Django-Rest-Framework并不能很好地解释它是如何工作的。有太多黑盒魔术混淆配置说明(在我看来)。
例如,它说我可以覆盖序列化程序中的创建或更新。因此,当我的视图发布时,我可以将数据发送到具有声明的更新方法的序列化程序。
class MySerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
def update(self, instance, validated_data):
更新只有在模型已经存在并且我们只是更新其中一些数据时才会被调用吗?或者在创建新的时候调用创建?
如果我要将此方法添加到该类,
def create(self, validated_data):
return MyObject.objects.create(**validated_data)
这是否是为了添加新对象必须调用的方法?并且你的覆盖能力应该放在序列化器中,但如果没有声明,这是带参数的默认方法被调用?
答案 0 :(得分:19)
有太多的黑盒子魔法混淆了配置说明(在我看来)。
如果您认为文档中有某些内容可以改进,请随时更新to submit a pull request。如果它看似合理,它可能会被合并并显示在将来的版本中。
如果未使用模型实例初始化序列化程序,则会调用还是在创建新的时调用create?
create
,但只会将数据传递给它。调用serializer.save()
后,序列化程序会检查是否传入了实例并直接调用create
,以便创建模型实例并将其保存在数据库中。
使用模型实例(或其他对象)初始化序列化程序并调用只有在模型已经存在且我们只是更新其中一些数据时才会调用更新吗?
update
时,将调用 serializer.save()
。与Model.objects.update()
相比,这大致相当于Model.objects.create()
。
这是否是为了添加新对象而必须调用的方法?
使用中央serializer.save()
方法设计序列化程序(包括对象创建和更新)。这类似于使用model.save()
方法保存或创建模型的方式。
并且你的覆盖能力应该放在序列化器中,但如果没有声明,这是带有被调用参数的默认方法吗?
如果您需要更改模型及其相关对象需要保存的逻辑,建议在序列化程序级别覆盖create
和update
,例如在使用嵌套序列化程序时