Django ORM:带或不返回obj的过滤器

2024-04-25 06:05:11 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码未返回对象,但它“应该”。我错了,我错了吗?我错了?

return Recipient.objects.filter(
        models.Q(mobile=mobile,
                 email=email,
                 incentive__id__exact=incentive_id) |
        models.Q(friends_mobile=mobile,
                 friends_email=email,
                 incentive__id__exact=incentive_id)
    ).order_by(
        '-date_created')[:1].get()

Tags: 对象代码idbyreturnobjectsmodelsemail
1条回答
网友
1楼 · 发布于 2024-04-25 06:05:11

使用.get()是有问题的。如果只对一个对象使用QuerySet,它将返回一个对象,但是如果有更多的对象,它将抛出MultipleObjectsReturned错误,如果QuerySet为空,它将抛出DoesNotExist错误。在

所以问题很可能是一个查询集,它不适用于您需要的特定条件。解决方案?返回默认值。在

最后,您可以使用[0],而不是仅限于一个对象然后获取它,而且,正如@pythonishvili所提到的,您可以对激励进行预过滤。总而言之,应该是这样的(为了更好的可读性,我将查询拆分为多行):

qs = Recipient.objects.filter(incentive__id__exact=incentive_id) #common filter
qs = qs.filter(models.Q(mobil‌​e=mobile, email=email) | 
               models.Q(friends_mobile=mobile, friends_email=email))
qs = qs.order_by('-date_created')
return qs[0] if qs else None #or any other default you'd like to use

相关问题 更多 >