Как фильтровать массив 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)
Вернуться на верх