2010-12-24 10 views
4

Ich versuche, ein Abfrageset mit meinem benutzerdefinierten Iterator in json zu serialisieren. Auf den Modellen erkenne ich die Felder im Modell und füge sie in das JSON-Diktat ein, wenn ich sie brauche.Wie kann ich feststellen, welche Felder in einem Django-Queryset verschoben/nur verschoben wurden?

Ich habe Probleme herauszufinden, wie Sie bestimmen, welche Felder im Modell mit der Defer oder nur mit der Funktion querieset zurückgestellt wurden.

Gibt es einen Weg und wie, um herauszufinden, welche Felder aufgeschoben sind und wie man sie überspringt?

+1

Haben Sie eine Idee, wie Sie diese Liste für eine resultierende Modellinstanz erhalten? Somehwere in model_instance._meta ?? : S –

Antwort

7

Etwas begraben ...

queryset.query.get_loaded_field_names()

6

Hier ist, wie Sie überprüfen können, ob es für eine tatsächliche Modellinstanz verschoben ist:

from django.db.models.query_utils import DeferredAttribute 


for field in model_istance._meta.concrete_fields: 
    if not isinstance(model_instance.__class__.__dict__.get(field.attname), DeferredAttribute): 
     # insert in json dict or whatever need to be done .... 

Auf diese Weise wird es Laden Sie dieses Feld nicht aus db. Diese Implementierung stammt tatsächlich von django. https://github.com/django/django/blob/master/django/db/models/base.py#L415

4

Aktuelle Version von Django (1.9) hat eine Methode auf allen Modellinstanzen: instance.get_deferred_fields()

Dies scheint die "offizielle" Implementierung von Alexey Antwort zu sein.

Verwandte Themen