已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
两年前关闭了。
Improve this question
有两种方法可以获取特定列中包含None
的对象
Book.objects.filter(publication__isnull=True).values('id')
以及
Book.objects.filter(publication=None).values('id')
这两个结果在同一查询中,即
SELECT id from book WHERE publication IS NULL;
所以,在这里我想检查,有没有任何不同的Angular ,如“性能”,“最佳实践”,“Python的方式”等,以便我可以决定使用哪一个。
我已经找到了相关的question,但答案并不令人满意
2条答案
按热度按时间63lcw9qa1#
详细阐述我的评论;
我不认为你会注意到性能上的差异,在代码、堆栈或事件请求-响应周期中有太多的地方存在瓶颈,
=None
与__isnull
不可能成为问题。如果发现应用程序的瓶颈是django内部的强制转换值,那么它必须是一个经过微调的应用程序和基础架构堆栈。
首先要澄清的是,django将这两行转换为完全相同的SQL查询;
MyModel.objects.filter(relationship=None)
MyModel.objects.filter(relationship__isnull=True)
这可以在this answer中看到
现在考虑一下这个应用程序,为了解决上述问题,所有对数据库的调用都必须尽可能快,所有调用都使用
select_related
和prefetch_related
,只提取使用查询集的功能所需的值。在基础设施中,你必须最小化承载应用程序的每个服务之间的延迟,然后在网站用户和你的Web服务器/CDN之间会有网络延迟。
最主要的一点是,在django的
None
到Null
shell 之外,有太多的延迟或性能低下的可能性。关于最佳实践等,如果你习惯用
__isnull
编写查询,那么你可以用它的逆来查找设置了数据的对象,这会给你的代码带来一致性,这是好代码的关键。为了忽略性能,使用
=None
而不是__isnull
是一个合理的理由,因为__isnull
适用于数据库中实际上没有值的null=True
字段。像JSONField
这样的字段可能存储一个空值,用JSON术语来说是null,但用数据库术语来说不是。有一个非常简洁的答案详细说明了here。kd3sttzy2#
据我所知,这两个函数在大多数方面都很相似,因为它们都是Django的原生函数。
field==None
不可逆,而field__isnull=True
可逆。例如:
如果你想反转
field = None
,这是一个额外的步骤,但对我来说,所有的问题是代码的一致性--如果你以前用过其中的一个,最好再次使用相同的函数,因为人们不必多次查找类似的东西。我在Django的Queryset documentation中查找了这两个选项,我可以在侧面导航栏中看到
isnull
,但不能看到None,所以看起来isnull
是一个更好的实践。