我正在使用Python 3.6.3、Django 2.0和PostgreSQL 9.4来完成这个项目。 在我的Ticket类中,我有一个JSONField类型的passenger字段。
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命令,我想过滤掉手机号不为空或者为None,并且sms_sent是False的票。
tickets = Ticket.objects.filter(
date=tomorrow, trip__bus_company=bus_company,
passenger__sms_sent=False
).not_cancelled()
现在,乘客短信发送状态为False的筛选器已经生效,仅返回短信发送状态为False的车票。但是乘客手机号码筛选器没有生效。 我尝试了以下所有方法:
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,但我无法排除掉乘客手机号为空的票据,我要么得到所有的车票,要么得到空的查询结果。
现在我能做到这一点:
for ticket in tickets:
if ticket.passenger['mobile'] is not None:
print(ticket.passenger['mobile'])
但这不是我要寻找的内容。我想使用筛选或排除来获取那些票。我做错了什么吗? 附:not_cancelled() 是我的经理,与乘客字段无关。
blank=True
将允许表单中的空值,但我认为你还需要使用null=True
来允许Django通过空值。 - Alan