让我们假设我的课程Person
有一个字段email
。我想基于queryset获取单个记录并将其分配给变量person
。可悲的是我做不到
person = Person.objects.filter(email="xxx@xxx.xxx")[0]
因为我可能会遇到异常。所以:
场景1 :在try-except中包含上述代码。
场景2 (我目前正在使用):
person_arr = Person.objects.filter(email="xxx@xxx.xxx")
if person_arr.exists():
person = person_arr[0]
....
场景3
for person in Person.objects.filter(email="xxx@xxx.xxx"):
....
场景4 :你建议其他的东西。
答案 0 :(得分:3)
在我看来,这是两种正确的方法:
Try-except解决方案(您的Scenario1):
try:
person = Person.objects.get(email="xxx@xxx.xxx")
except Person.DoesNotExist:
person= None
使用first()的Django 1.6+解决方案(推荐):
person = Person.objects.filter(email="xxx@xxx.xxx").first()
这来自文档:
返回查询集匹配的第一个对象,如果有,则返回None 没有匹配的对象。如果QuerySet没有定义排序,那么 queryset由主键自动排序。
如果对象不存在,此解决方案将允许您执行任何操作。
请注意,只有在没有重复的电子邮件时才会有效,这在这种情况下完全有意义。
答案 1 :(得分:1)
您可以使用get_object_or_404
代替:
from django.shortcuts import get_object_or_404
person = get_object_or_404(Person, email="xx@xxx.com")
答案 2 :(得分:0)
有一条特殊的捷径 - get_object_or_404()
。
相当于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
为什么它更好?如果您还没有找到对象,那么404就是一个合适的答案。此快捷方式允许您保持代码清洁。