Django JSONField过滤Queryset

时间:2018-04-21 12:44:49

标签: python django postgresql

对于项目我使用的是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命令,我想要过滤那些非空或无移动的票证,而sms_sent为False。

    tickets = Ticket.objects.filter(
        date=tomorrow, trip__bus_company=bus_company,
        passenger__sms_sent=False
    ).not_cancelled()

现在,乘客_sms_sent =假过滤器正在运行,并且正在为我的唯一门票提供sms_sent = 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放在第一个过滤器中,但是我无法过滤掉(排除)passenger__mobile为null的票证,我要么获得所有票证,要么清空查询集。

现在我可以这样做:

for ticket in tickets:
            if ticket.passenger['mobile'] is not None:
                print(ticket.passenger['mobile'])

但这不是我想要的。我想使用过滤器或排除来获取这些票。我做错了什么? 附: not_cancelled()是我的经理,它与乘客领域没有任何关系。

1 个答案:

答案 0 :(得分:4)

根据这个https://code.djangoproject.com/ticket/25718(参见上一篇,结束评论),以下内容应该有效model.objects.filter(field__key=None)(但显然你应该使用带修复的Django版本)。< / p>

django docs https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#querying-jsonfield

警告

  

由于任何字符串都可以是JSON对象中的键,因此任何其他字符串都可以查找   比下面列出的将被解释为键查找。没有错误   被提出来了。键入错误要格外小心,并经常检查   您的查询按预期工作。

这里他们是https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#containment-and-key-operations