在Django 1.6中,他们引入了Failed to attach 'veth1SE4RV' to the bridge 'vport1': Operation not permitted
来获取查询集的第一个元素。 [Source]
现在有两种方法可以获得单个元素:
.first()
和
user_id = 42
try:
obj = User.objects.get(id=user_id)
except ObjectDoesNotExist:
raise Exception("Invalid user id given")
按照pythonic的方式请求宽恕,第一个会更受赞赏的方式使用。 但是,第二个可能更容易理解,它更短一行。
Q1:这两个代码段之间的速度是否存在差异?
Q2:哪一种是获取单个对象的首选方式?
答案 0 :(得分:4)
两者有不同的语义和不同的gaurantees。主要区别在于它们如何处理多个匹配对象。
如果多个对象与给定查询匹配, .get()
将引发异常。因此,您应该使用.get()
根据唯一属性(例如id
)或属性集来获取项目。
.first()
将根据定义的顺序返回第一个项目。当您需要单个项目时,使用此选项过滤非唯一属性,第一个项目基于某些(可能是未定义的)排序。
因此,虽然.get()
保证只有一个项与查询匹配,但.first()
仅保证它根据给定的顺序返回第一个项。
它们如何处理丢失的对象更多是语义的情况。将异常转换为None
或相反的方法是微不足道的。虽然你可以在这里和那里保存一行,但我的决定不是基于另一行。性能差异也可以忽略不计,可能取决于查询结果。