2017-11-28 4 views
1

Ich habe eine queryset von Products mit JSONFieldattributes enthält dictFilter Django queryset für einen dict Wert

class Product(models.Model): 
attributes = JSONField(
    pgettext_lazy('Product field', 'attributes'), 
    encoder=DjangoJSONEncoder, default={}) 

I Products wo attributes['12'] == '31'

Nach einem Werk filtern möchten:

qs.filter(attributes__contains={'12': '31'})

Nach o ne nicht:

qs.filter(attributes__12='31') Ist das etwas, was ich mit PostgreSQL erreichen kann oder sollte ich es nach ES verschieben?

EDIT: Leider kann ich nicht die erste Lösung verwenden, da diese dict mehr Schlüssel enthalten kann.

Erste Lösung funktioniert gut. Gegeben haben wir:

product.attributes = {'333': ['6', '1']} 

Wir können es herausfiltern von:

Product.objects.filter(attributes__contains={'333': ['6']} 

usw. Völlig übersehen sie.

+1

Nach [diese Frage] (https://stackoverflow.com/questions/23697540/query-a-json-key-in-postgres-json-field), Postgres unterstützt es, aber ich bin mir nicht sicher, ob/wie Django das erreicht. – Randyr

Antwort

2

Sie sollten das zweite Format verwenden können, d. H. qs.filter(attributes__key='value').

Ihr Problem in diesem Fall, wie explained in the docs, ist, dass, wenn eine ganze Zahl als Schlüssel in einer JSON-Abfrage verwendet, wird der Schlüssel als Index eines Arrays verwendet werden, es ist also als attributes[12] statt attributes['12'] interpretiert.

Solange Sie bei String-Keys bleiben, sollten Sie in Ordnung sein.

Ein Beispiel:

class MyModel(models.Model) 
    json = JSONField(default=dict) 


p = MyModel.objects.create(json={'0': 'something', 'a': 'something else'}) 

MyModel.objects.filter(json__0='something') # returns empty queryset 
MyModel.objects.filter(json__a='something else') # returns the object created above 
Verwandte Themen