为什么django ORM的`save`方法不返回保存的对象?

时间:2012-06-07 17:23:05

标签: django orm django-models

对此设计决策背后的推理有何见解?在我看来,让obj.save()返回某些东西,只有好处(比如方法链),没有任何缺点。

3 个答案:

答案 0 :(得分:55)

通常认为在Python中使用主要影响现有对象而不是返回自身的函数是一种很好的做法。例如,sorted(yourlist)返回已排序的列表,但yourlist.sort()就地排序列表并且不返回任何内容。

在单行上执行带副作用的多个操作(与焦点在返回值上的无副作用函数相反)并不是一个好习惯。在行数方面,代码将更加紧凑,但由于重要的副作用可能隐藏在链的中间,因此难以阅读。如果你想使用方法链接,在链的开头使用没有副作用的函数,然后在最后有一个副作用,如.save()

换句话说,在方法链中,链的开头是输入,链的中间转换输入(在树中导航,对输入进行排序,更改字符串的大小写等)和链的末端是与副作用一起起作用的功能部分。如果你在链中间埋葬带有副作用的方法,那么你的方法链实际上会做什么就不清楚了。

答案 1 :(得分:3)

这让我想起Greg Ward espoused最近在Pycon2015上的一般原则,而不是将功能与程序混淆。每个函数都应返回一个值或有副作用,但不能同时返回两个。

基本上与dict.update()的问题is asked相同。

答案 2 :(得分:0)

由于这是我在搜索“ django返回保存的对象”时得到的第一个结果,因此如果您仍想返回保存的对象,而不是使用:

ExampleModel(title=title).save()

返回无,您将使用:

saved_instance = ExampleModel.objects.create(title=title)

这是可行的,因为ExampleModel.objectsModel Manager而不是类的实例,因此它不会返回自身。