Django Model.ObjectDoesNotExist异常

时间:2015-02-16 05:21:10

标签: python django exception-handling

在这里,我想让获胜者与查询相匹配。如果我没有那个赢家,我想去创造胜利者

winner_check = Winner.objects.get(win_date__year=today.year, win_date__month=today.month, win_date__day=today.day)
if winner_check:
    final_winner = winner_check
    message = "Winner already generated for today."
    return anything

else:
    winner_index = random.randint(0, len(player_list)-1)
    winner = player_list[winner_index]
    return anything

这是正确的做法还是我应该生成例外

try:
    winner_check = Winner.objects.get(win_date__year=today.year, win_date__month=today.month, win_date__day=today.day)
    final_winner = winner_check
    message = "Winner already generated for today"
    return anything
except Winner.DoesNotExist:
    winner_index = random.randint(0, len(player_list)-1)
    final_winner = player_list[winner_index]
    return anything

如果我只想获得不创建

,那该怎么办?
try:
    winner_check = Winner.objects.get(win_date__year=today.year, win_date__month=today.month, win_date__day=today.day)
except Winner.DoesNotExist:
    pass

如果没有用户,我想进一步处理回复消息,例如"没有赢家" 任何人都可以引导我通过get()方法的例外

1 个答案:

答案 0 :(得分:3)

首先,我建议您将win_date字段定义为models.DateField(),以便使用datetime.date对象进行查找,并避免在下面使用;

winner = Winner.objects.get(win_date__year=today.year, win_date__month=today.month, win_date__day=today.day)

相反,你将能够找到这样的赢家;

from django.utils import timezone

winner = Winner.objects.get(win_date=timezone.now().date())

至于您的问题,您可以使用get_or_create()方法搜索具有给定win_date的获胜者,如果找不到则创建新的获胜者。

winner, created = Winner.objects.get_or_create(win_date=timezone.now().date(), defaults={"name": "Vishnu", "surname": "Raj"})

if created:
    print "New winner has been generated"
else:
    print "Winner has already been generated for today"

对于问题的第二部分,关于检索对象和处理DoesNotExist例外,我建议你使用get_object_or_404(),当找不到对象时会引发Http404错误。

from django.utils import get_object_or_404
from django.http import Http404

def get_winner(request, id):
    try:
        winner = get_object_or_404(Winner, pk=id)
    except Http404:
        winner = Winner(win_date=..., name=..., surname=...)

对于这类情况,发送用户404错误而不是500几乎总是更好的方法,因为500表示服务器错误,而404表示“未找到”。