tôi chạy Django 1.9 với JSONField mới và có mô hình thử nghiệm như sau:Django lọc JSONField danh sách dicts
class Test(TimeStampedModel):
actions = JSONField()
Hãy nói rằng hành động JSONField trông như thế này:
[
{
"fixed_key_1": "foo1",
"fixed_key_2": {
"random_key_1": "bar1",
"random_key_2": "bar2",
}
},
{
"fixed_key_1": "foo2",
"fixed_key_2": {
"random_key_3": "bar2",
"random_key_4": "bar3",
}
}
]
Tôi muốn có thể lọc các phím foo1 và foo2 cho mọi mục trong danh sách. Khi tôi làm:
>>> Test.objects.filter(actions__1__fixed_key_1="foo2")
Thử nghiệm nằm trong bộ truy vấn. Nhưng khi tôi làm:
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
Điều đó không có ý nghĩa. Tôi muốn làm điều gì đó như:
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
Hoặc
>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")
Và có Test trong queryset.
Bất kỳ ý tưởng nào nếu điều này có thể được thực hiện và cách thực hiện?
Tôi thực sự đã sử dụng trường mô hình cụ thể JSONField của PostgreSQL ('từ django.contrib.postgres.fields nhập JSONField').Giải pháp của bạn hoạt động khi 'your_property' được biết (' fixed_key_1' và 'fixed_key_2' trong trường hợp của tôi) nhưng làm thế nào tôi có thể làm khi tôi không biết' your_property' ('random_key_ #' trong trường hợp của tôi)? – Scentle5S
Bạn nên đặt '{'fixed_key_1': 'foo2'}' của bạn, tôi đã cập nhật mã bằng hàm chung. – DhiaTN
Điều tôi không biết là 'your_property'. Nó có thể là bất cứ điều gì và tôi thậm chí không quan tâm về nó, chỉ muốn biết nếu JSONField có chứa một chuỗi nhất định trong bất kỳ giá trị của nó, bất kể chiều sâu. – Scentle5S