以下代码不返回对象,但它“应该”。我正在通过移动电话,电子邮件和激励ID的正确匹配,那么我做错了什么?
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()
答案 0 :(得分:1)
使用.get()
是有问题的。如果使用只有一个对象的QuerySet,它将返回一个对象,但是如果有更多它会抛出MultipleObjectsReturned
错误,如果QuerySet为空,它将抛出DoesNotExist
错误。
所以问题很可能是一个不适用于您需要的特定条件的QuerySet。解决方案?返回默认值。
最后,你可以使用[0]
而不是限制一个对象然后获取它,并且,正如@pythonishvili所提到的,你可以预先过滤激励。总而言之,它应该是这样的(为了更好的可读性,我将查询分成多行):
qs = Recipient.objects.filter(incentive__id__exact=incentive_id) #common filter
qs = qs.filter(models.Q(mobile=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