Corro Django 1.9 con il nuovo JSONField e hanno il seguente modello di prova:Django filtrare l'elenco JSONField di dicts
class Test(TimeStampedModel):
actions = JSONField()
Diciamo che l'azione JSONField assomiglia a questo:
[
{
"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",
}
}
]
voglio essere in grado di filtrare i tasti foo1 e foo2 per ogni elemento della lista. Quando faccio:
>>> Test.objects.filter(actions__1__fixed_key_1="foo2")
La prova è nel set di query. Ma quando lo faccio:
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
Non lo è, il che ha senso. Voglio fare qualcosa di simile:
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
O
>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")
E avere la prova nel set di query.
Qualche idea se questo può essere fatto e come?
In realtà sto già utilizzando il campo del modello specifico JSONField di PostgreSQL ('da django.contrib.postgres.fields import JSONField').La soluzione funziona quando 'your_property' è noto (' fixed_key_1' e 'fixed_key_2' nel mio caso) ma come posso fare quando non conosco' your_property' ('random_key_ #' nel mio caso)? – Scentle5S
Dovresti rendere '{'fixed_key_1': 'foo2'}' il tuo parametro, ho aggiornato il codice con la funzione generica. – DhiaTN
La cosa è che non so in particolare 'your_property'. Potrebbe essere qualsiasi cosa e non mi interessa nemmeno, voglio solo sapere se JSONField contiene una determinata stringa in uno qualsiasi dei suoi valori, indipendentemente dalla profondità. – Scentle5S