Django ORM:过滤OR而不返回对象

时间:2014-02-09 11:25:42

标签: python django django-models

以下代码不返回对象,但它“应该”。我正在通过移动电话,电子邮件和激励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()

1 个答案:

答案 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(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