Djangoシリアライザーの応答に追加データを含める方法
-
03-07-2019 - |
質問
DjangoとjQueryを使用してライブサーチを試みています。私がやったことは、getJSON関数でjavascriptにデータを要求させ、Djangoシリアライザーによって自動化されたJSON応答を返すビューをDjangoに設定しました。
これはうまく機能し、text / javascript content-typeでjson応答を返します。すべてのデータの送信を回避するために、(私は必要ないことをたくさん)私はこれをしました:
response.write(serializers.serialize(" json&quot ;, soknad_list、fields =( 'name'、 'image'、 'genre')))
たとえば、「genre」フィールドはmanyToManyフィールドなので、ジャンルIDだけでなく、たとえばgenre.all.0から値を取得することは可能ですか?
モデルには get_absolute _url
という関数がありますが、JSONレスポンスに含めることは可能ですか?
だから、私の質問は、JSON応答に生のフィールドデータ以外のものを含めることは可能ですか?そうでない場合、私の問題をどのように解決しますか?
解決 3
最も簡単なことは、シリアライザをまったく使用しないことであることがわかりました。なぜこれを考えなかったのかはわかりませんが、汎用オブジェクトリストビューを使用してmimetypeをtext / javascriptに変更し、htmlテンプレートを使用したJSONテンプレートを作成しました。
非常にシンプルで、その方法で、JSON応答に必要なすべてのデータを取得できました。この方法で、htmlテンプレートに追加できるすべてのものをJSONレスポンスに追加できます。ページ分割も可能です。
作成したビューの抽出例:
return object_list(request、queryset = object_list、template_name = 'search / results.js'、template_object_name = 'result'、paginate_by = 12、mimetype = 'text / javascript')
他のヒント
DjangoのJSONシリアル化はsimplejsonに基づいています。simplejsonは直接使用し、任意の種類のオブジェクトを処理するために自由に拡張できます。そのため、ここには主に2つのオプションがあります。関連データを使用してdictのリストを手動で作成し、それをsimplejson.dumps()(デフォルトでは文字列、リスト、dict、数値をサポート)に渡すか、特定のデータセットをシリアル化します。 FWIW、これは(十分にテストされていませんが、今のところ機能しています)Djangoモデル対応のjsonエンコーダーです:
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
追加のデータを含めることができる便利なdjangoサードパーティアプリ/シリアライザーがあります。また、モデルの関係を含め、フィールドのリストを除外することもできます。
で利用可能です http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers