首页 > 解决方案 > 为什么 Django 在 SQL 子句中添加“IS NOT NULL”?

问题描述

我有模型:

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

当我运行查询集时:

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=('',)

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

标签: pythondjango

解决方案


您需要将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')

推荐阅读