Django:检索对象的最佳方法

时间:2017-11-08 23:07:47

标签: django django-queryset

让我们假设我的课程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 :你建议其他的东西。

3 个答案:

答案 0 :(得分:3)

在我看来,这是两种正确的方法:

  1. Try-except解决方案(您的Scenario1):

    try:
        person = Person.objects.get(email="xxx@xxx.xxx")
    except Person.DoesNotExist:
        person= None
    
  2. 使用first()的Django 1.6+解决方案(推荐):

    person = Person.objects.filter(email="xxx@xxx.xxx").first()
    
  3. 这来自文档:

      

    返回查询集匹配的第一个对象,如果有,则返回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就是一个合适的答案。此快捷方式允许您保持代码清洁。