在Django 1.6中,他们引入.first()
了获取查询集的第一个元素。[来源]
现在有两种获取单个元素的方法:
user_id = 42
try:
obj = User.objects.get(id=user_id)
except ObjectDoesNotExist:
raise Exception("Invalid user id given")
和:
user_id = 42
obj = User.objects.filter(id=user_id).first()
if not obj:
raise Exception("Invalid user id given")
遵循pythonic方式请求宽恕,第一个将是更受赞赏的使用方式。但是,第二个可能更容易理解,并且短了一行。
问题1:这两个代码段之间的速度是否有差异?
问题2:获取单个对象的首选方法是什么?
两者具有不同的语义和不同的保证。主要区别在于它们如何处理多个匹配的对象。
.get()
如果多个对象与给定查询匹配,将引发异常。因此,您应该使用.get()
来基于唯一属性(例如id
)或一组属性来获取项目。
.first()
如果多个对象与给定查询匹配,则将基于定义的顺序返回第一项。当需要单个项目时,可使用此选项过滤非唯一属性,第一个基于某些(可能未定义)排序。
因此,尽管.get()
保证一个项目与查询完全匹配,但.first()
仅保证它根据给定的顺序返回第一个项目。
他们如何处理丢失的对象更多是语义问题。将异常转换为None
或以其他方式转换是微不足道的。尽管您可能会在这里和那里保存一行,但我不会因此而决定使用另一行。性能差异也可以忽略不计,并且可能取决于查询的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句