[英]Django JSONField filtering Queryset where filter value is annotated sum value
[英]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.