簡體   English   中英

Django JSONField過濾Queryset

[英]Django JSONField filtering Queryset

對於項目,我正在使用Python 3.6.3,Django 2.0和Postgre 9.4。 在我的班票中,有一個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為null的票證,我要么得到所有票證,要么查詢集為空。

現在我可以這樣做:

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

但這不是我想要的。 我想使用過濾器或排除以獲取那些票證。 我做錯了什么? PS not_cancelled()是我的經理,它與乘客領域沒有任何關系。

根據這個https://code.djangoproject.com/ticket/25718 (請參閱最后一個結束語),以下應該可以正常運行model.objects.filter(field__key=None) (但是顯然您應該使用帶有修復程序的Django版本 )。

django文檔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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM