2016-11-16 32 views
7

Ich hoffe, eine Django-Abfrage durch den Vergleich zweier Werte innerhalb einer JSONField-Klasse zu machen. Ich lief über Django F() Objekte für Referenzen Felder im Modell, aber es scheint nicht mit JSONField zu arbeiten, wie es versucht, eine JOIN mit dem späteren Abschnitt zu tun. So zum Beispiel:Django, JSONField, Postgres und F() Objektvergleich

class Event(models.Model): 
    data = JSONField(default=None) 

Nehmen wir an, das Datenfeld so etwas wie folgt aussieht:

{ 
    "value_1":20, 
    "value_2":25 
} 

Ich hatte gehofft, es wie so abfragen:

events = Event.objects.filter(data__value_2__gte=F('data__value_1')) 

jedoch der Fehler so etwas wie dieses:

Cannot resolve keyword 'value_1' into field. Join on 'data' not permitted. 

Auch haben versucht:

events = Event.objects.filter(data__value_2__gte=F('data')['value_1']) 

Aber da bin den Fehler:

TypeError: 'F' object has no attribute '__getitem__' 

auch; Django 1.10, Python 2.7.11, PG Version: 9.4.9

Gibt es eine Idee, wie man basierend auf einem Vergleich von Wert_1 und Wert_2 filtern kann?

+0

Dies ist nur eine Vermutung, aber versuchen Sie 'data__value_2__gte = F ('Daten') ['value_1']'. –

+0

Hat nicht funktioniert: TypeError: 'F' Objekt hat kein Attribut '__getitem__' – dperconti

+0

Django 1.10, Python 2.7.11 – dperconti

Antwort

2

Die Art, wie es aussieht, kann gesagt werden, dass F-Ausdrücke json Feldsuche nicht unterstützt.

SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= "test_event"."data" -> 'value_2' 

Was auch immer Sie mit F Ausdruck versuchen, es: Wie Sie unter der SQL-Abfrage generiert für unter django Abfrage

print Event.objects.filter(data__value_1=F('data')).query 
SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= ("test_event"."data") 

Damit dies auf Postgres arbeiten sehen kann, sollte die Abfrage unten sein erzeugt das Format "test_mymodal"."data" -> 'value_2' für den Ausdruck nicht.

+0

Ich habe meine Datenstrukturen neu modelliert, so dass ich F-Objekte verwenden kann. Trotzdem scheint dies eine korrekte Erklärung und Abhilfe zu sein, obwohl ich nicht getestet habe. – dperconti

Verwandte Themen