Django为什么要在SQL子句中添加“ IS NOT NULL”?

时间:2018-11-17 03:49:51

标签: python django

我有模特:

class Profile:
    ...
    phone = models.CharField(max_length=50, blank=True, null=True)
    ...

当我运行queryset时:

Profile.objects.exclude(phone='', phone__isnull=True).values('phone')

它创建SQL代码:

SELECT "user_profile_profile"."phone" FROM "user_profile_profile" WHERE NOT ("user_profile_profile"."phone" IS NULL AND "user_profile_profile"."phone" = '' AND "user_profile_profile"."phone" IS NOT NULL); args=('',)

这是错误的,因为它返回所有电话,包括phone = None和phone =''。

1 个答案:

答案 0 :(得分:1)

您需要将exclude条件分为两部分:

Profile.objects.exclude(phone='').exclude(phone__isnull=True).values('phone')

或使用Q对象

from django.db.models import Q
Profile.objects.exclude(Q(phone='')|Q(phone__isnull=True)).values('phone')