Frage

Ich versuche, eine Livesuche mit Django und jQuery zu machen. Was ich getan habe, ist das Javascript mit der getJSON Funktion für einige Daten machen fragt, dann habe ich einen Blick in Django einrichten, die eine JSON-Antwort durch den Django Serializer automatisiert zurück.

Und das funktioniert gut, es gibt eine Json Antwort mit dem text / javascript Content-Type. Um zu vermeiden, um alle Daten zu senden, (eine Menge, die ich nicht brauchen) i tat dies:

response.write(serializers.serialize("json", soknad_list, fields=('name', 'image', 'genre')))

Aber zum Beispiel des ‚Genre‘ Feld ist ein ManyToMany Feld, so ist es möglich, die Werte von genre.all.0 zum Beispiel zu bekommen und nicht nur das Genre ID?

Und das Modell hat eine Funktion get_absolute _url, ist es möglich, dies in der JSON-Antwort enthält, wenn ja, wie?

Also ich meine Frage erraten ist, ist es möglich, Sachen anders als die rohen Felddaten in der JSON-Antwort enthält, wenn nicht, wie würden Sie gehen über mein Problem zu lösen?

War es hilfreich?

Lösung 3

Ich fand heraus, dass die einfachste Sache war überhaupt nicht zu den Serializer zu verwenden. Ich weiß nicht, warum ich vor diesen denken tue nicht, aber ich habe nur eine generische Objekt Listenansicht und änderte den MIME-Typen / javascript in Text und machte eine JSON Vorlage einer HTML-Vorlage insted.

Sehr einfach, und auf diese Weise gelang es mir, alle Daten zu erhalten i in die JSON-Antwort wollte. So können Sie alles addieren, die Sie zu einer HTML-Vorlage in eine JSON-Antwort hinzufügen können, auch Paginieren.

Beispiel Extraktion der Ansicht i erstellt:

return object_list(request, queryset=object_list, template_name='search/results.js', template_object_name='result', paginate_by=12, mimetype='text/javascript')

Andere Tipps

Django JSON Serialisierung basiert auf simplejson, die Sie direkt und erstrecken sich nach Belieben nutzen können zu handhaben, gleich welcher Art von Objekten. So haben Sie meist zwei Möglichkeiten: entweder manuell eine Liste von dicts mit relevanten Daten bauen und übergeben es an simplejson.dumps () (die standardmäßig Unterstützung Strings, Listen, dicts und Numerik) oder schreiben Sie Ihren eigenen json-Encoder, der weiß, wie Ihre spezifischen Datensatz serialisiert. FWIW, hier ist ein (nicht gut getestet, aber arbeitete bisher) Django Modell bewusst json-Geber:

from django.utils import simplejson
from django.utils import datetime_safe
from django.utils.functional import Promise
from django.utils.translation import force_unicode
from django.utils.encoding import smart_unicode
from django.core.serializers.json import DjangoJSONEncoder

class ModelJSONEncoder(DjangoJSONEncoder):
    """
    (simplejson) DjangoJSONEncoder subclass that knows how to encode fields.

    (adated from django.serializers, which, strangely, didn't
     factor out this part of the algorithm)
    """
    def handle_field(self, obj, field):
        return smart_unicode(getattr(obj, field.name), strings_only=True)

    def handle_fk_field(self, obj, field):
        related = getattr(obj, field.name)
        if related is not None:
            if field.rel.field_name == related._meta.pk.name:
                # Related to remote object via primary key
                related = related._get_pk_val()
            else:
                # Related to remote object via other field
                related = getattr(related, field.rel.field_name)
        return smart_unicode(related, strings_only=True)

    def handle_m2m_field(self, obj, field):
        if field.creates_table:
            return [
                smart_unicode(related._get_pk_val(), strings_only=True)
                for related
                in getattr(obj, field.name).iterator()
                ]

    def handle_model(self, obj):
        dic = {}
        for field in obj._meta.local_fields:
            if field.serialize:
                if field.rel is None:
                    dic[field.name] = self.handle_field(obj, field)
                else:
                    dic[field.name] = self.handle_fk_field(obj, field)
        for field in obj._meta.many_to_many:
            if field.serialize:
                dic[field.name] = self.handle_m2m_field(obj, field)
        return dic

    def default(self, obj):
        if isinstance(o, Promise):
            return force_unicode(o)

        if isinstance(obj, Model):
            return self.handle_model(obj)

        return super(ModelJSONEncoder, self).default(obj)

HTH

Es ist ein handliches django Dritten app / Serializer, die Sie zusätzliche Daten enthalten können. Es erlaubt Ihnen auch Modellbeziehungen aufzunehmen und eine Liste der Felder auszuschließen.

Es ist erhältlich bei http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top