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

gar*_*ois 35 django orm django-models

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

And*_*ter 56

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

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

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

  • @maazza我刚刚在Django 1.5.1上试过这个,而save()仍然返回None.[最新开发版本的源代码](https://github.com/django/django/blob/master/django/db/models/base.py#L492)似乎也没有返回任何内容. (2认同)

Joh*_*ann 7

这让我想起了 Greg Ward最近在 Pycon2015 上提倡的一般原则,不要将函数与过程混淆。每个函数都应该返回一个值或有副作用,但不能同时返回。

基本上同样的问题被问dict.update的()。


Amr*_*wad 5

由于这是我在搜索“django 返回保存的对象”时得到的第一个结果,为了赞美安德鲁的答案,如果您仍然想返回保存的对象,而不是使用:

ExampleModel(title=title).save()
Run Code Online (Sandbox Code Playgroud)

它返回 None,您可以使用:

saved_instance = ExampleModel.objects.create(title=title)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为ExampleModel.objects它是模型管理器而不是类的实例,所以它不会返回自身。