【问题标题】:Django Model.ObjectDoesNotExist ExceptionsDjango Model.ObjectDoesNotExist 异常
【发布时间】:2015-02-16 05:21:10
【问题描述】:

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

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() 方法的异常

【问题讨论】:

    标签: python django exception-handling


    【解决方案1】:

    首先,我建议您将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 表示“未找到”。

    【讨论】:

    • 知道了...如果我没有找到获胜者并想设置获胜者怎么办
    • 你能扩展“设置赢家”这个词吗?
    • 如果没有 id=5 的获胜者,那么我想生成一个用户,就像我在第二个代码块中所做的那样,在我的问题中使用 try catch。这样做对吗?
    • 是的,这将是正确的地方。我已经更新了我的答案以涵盖该案例。
    • 谢谢你.. 我会去的
    猜你喜欢
    • 2015-08-12
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2012-06-09
    • 2012-10-25
    相关资源
    最近更新 更多