Как фильтровать массив JSON в Django JSONField
Как я могу отфильтровать данные всей строки, в которой инвентаризация id=2
Это данные результата, которые я хочу получить:
sampleData = [
{'rate': 1, 'inventory': {'id': 1, 'name': 'inv1'}, 'inputQuantity': 4},
{'rate': 1, 'inventory': {'id': 2, 'name': 'inv2'}, 'inputQuantity': 10, 'parentInventory': 2}
]
Вот пример базы данных:
inventoryList=[
[
{'rate': 1, 'inventory': {'id': 1, 'name': 'inv1'}, 'inputQuantity': 4},
{'rate': 1, 'inventory': {'id': 2, 'name': 'inv2'}, 'inputQuantity': 10, 'parentInventory': 2}
],
[
{'rate': 4, 'inventory': {'id': 5, 'name': 'inv2'}, 'inputQuantity': 4},
{'rate': 3, 'inventory': {'id': 4, 'name': 'inv4'}, 'inputQuantity': 1}
],
[
{'rate': 2, 'inventory': {'id': 5, 'name': 'inv1'}, 'inputQuantity': 5},
{'rate': 4, 'inventory': {'id': 6, 'name': 'inv2'}, 'inputQuantity': 10, 'parentInventory': 2}
],
]
Фильтр будет выглядеть так:
sampleLog.objects.filter(inventoryList__contains=[{"inventory":{'id': 2}}])
для этого случая можно использовать необработанный запрос https://docs.djangoproject.com/en/4.1/topics/db/sql/
Если вы используете PostgreSQL, то есть несколько удобных функций, которые я знаю для этого случая, ниже было рассказано о том, как фильтровать массив json в postgres postgresql: Фильтр в массиве JSON
Я думаю, что подобные функции могут быть и в других базах данных, вы можете попробовать погуглить сами.
также, вот некоторый полезный пример, который я написал для фильтрации данных вашей выборки
inventory_id = 2
# get the model's table name
table_name = models.sampleLog.objects.model._meta.db_table
# making raw SQL query through django ORM's Manager
__items = models.sampleLog.objects.raw(f"""
SELECT DISTINCT ON (log_item.id) log_item.*
FROM \"{table_name}\" log_item
CROSS JOIN JSON_ARRAY_ELEMENTS(log_item.\"inventoryList\"::JSON) AS inv_list
WHERE inv_list->'inventory'->>'id' = '{inventory_id}'
""")
# traverse the queryset result
for sample_log in __items:
# write your processing code here
print(sample_log)