2016-11-28 1 views
0

Gibt es eine Möglichkeit, ein Objekt abzufragen, ein verschachteltes Stück Daten aus einem JSONField Feld zu extrahieren und es dann als benutzerdefiniertes, temporäres Feld für jede Instanz des Querysets verfügbar zu machen?Geschachtelten Wert aus einem Django-Jsonfeld extrahieren

In meinem Anwendungsfall speichere ich Überlaufmetadaten von Twitter's API in einem data Feld für die spätere Verwendung. Ich möchte auf das verschachtelte Feld followers_count innerhalb TwitterPost.data zugreifen können.

Ich habe die Dokumentation über das Filtern nach geschachtelten Werten gelesen, aber nicht, wie es als temporäres Feld beim Generieren eines Abfrage-Sets extrahiert wird.

In ähnlicher Weise habe ich die annotate Dokumente für Möglichkeiten zum Erstellen eines benutzerdefinierten temporären Felds gelesen, aber die Beispiele verwenden alle Aggregationsfunktionen auf einfache Felder, also nicht JSONFields.

Vielen Dank im Voraus für Anregungen.

Beispiel Modell:

from django.contrib.postgres.fields import JSONField 

class TwitterPost(models.Model): 
    id = models.IntegerField() 
    data = JSONField() 

Beispiel JSON-Wert für die data Feld:

{ 
    'followers_count': 7172, 
    "default_profile_image": false, 
    "profile_text_color": "000000" 
} 

Pseudocode für das, was Ich mag würde der Lage sein, zu tun:

TwitterPost.objects.annotate(followers_count=instance.data.followers_count) 

Antwort

1

Dies ist ein wahrscheinlich ein spätes anwerut es tatsächlich einen Weg, es

from django.contrib.postgres.fields.jsonb import KeyTextTransform 

TwitterPost.objects.annotate(followers_count=KeyTextTransform('data', 'followers_count')) 
+1

Ja, das wurde in einer späteren Version von Django (1.11 IIRC) hinzugefügt und ich benutze es, seit ich diese Frage gestellt habe. Danke, dass Sie die Antwort für zukünftige Suchende hinterlassen haben. –

0

Wenn Wenn Sie auf die Daten in einem JSONField zugreifen möchten, müssen Sie __ verwenden. In Ihrem Beispiel wird es so etwas wie dieses

TwitterPost.objects.annotate(followers_count=instance.data__followers_count) 

in der Dokumentation Werfen Sie einen Blick here

+0

Dank zu tun ist @injaon - Ich werde es am Montag versuchen und die Antwort dann markieren. –

Verwandte Themen