【发布时间】:2018-10-02 00:18:43
【问题描述】:
对于项目,我使用的是 Python 3.6.3、Django 2.0 和 Postgre 9.4。 在我的班级 Ticket 中,有一个 JSONField 乘客
passenger = JSONField(blank=True)
我的乘客 JSON 看起来像这样:
{
"email": null,
"mobile": "21312",
"passport": "2141241",
"sms_sent": false,
"full_name": "something"
},
{
"email": null,
"mobile": null,
"passport": "1231231",
"sms_sent": false,
"full_name": "Irfan"
},
{
"email": null,
"mobile": null,
"passport": "1231231",
"sms_sent": true,
"full_name": "Irfan"
}
现在我有 django 命令,我想在其中过滤具有不为 null 或 None 的移动设备的票证,并且 sms_sent 为 False。
tickets = Ticket.objects.filter(
date=tomorrow, trip__bus_company=bus_company,
passenger__sms_sent=False
).not_cancelled()
现在,passenger__sms_sent=False 过滤器正在工作,并且正在提供我唯一的带有 sms_sent=False 的票。但是passenger__mobile 过滤器不起作用。 我尝试了所有这些:
tickets = tickets.exclude(passenger__mobile=None)
tickets = tickets.exclude(passenger__mobile=None).exclude(passenger__mobile='')
tickets = tickets.exclude(passenger__mobile__isnull=True)
tickets = tickets.exclude(passenger__exact={'mobile': None})
tickets = tickets.exclude(passenger__mobile__isnull=True).exclude(passenger__mobile='')
tickets = tickets.exclude(passenger__mobile__isnull=False).exclude(passenger__mobile='')
tickets = tickets.exclude(Q(passenger__mobile__isnull=True) | Q(passenger__mobile=''))
并且还将passenger__mobile放在第一个过滤器中,但我无法过滤掉(排除)passenger__mobile为空的票,我要么得到所有票,要么空查询集。
现在我可以这样做了:
for ticket in tickets:
if ticket.passenger['mobile'] is not None:
print(ticket.passenger['mobile'])
但这不是我想要的。我想使用过滤器或排除来获取这些票。我做错了什么? 附: not_cancelled() 是我的经理,它与乘客字段没有任何关系。
【问题讨论】:
-
你确定数据库中有空值的记录吗?
blank=True将允许表单中的空值,但我相信您还需要null = True以允许通过 django 使用空值。 -
@Alan 问题是我的模型已经是空白=True,null=True,在这种情况下没有区别,它仍然不起作用,所以我将它改为只有空白=是的,所以它不会允许 null 和 None。在 db 中它是 "mobile": null
标签: python django postgresql