نماذج django ليست jax serializable
-
12-09-2019 - |
سؤال
لدي وجهة نظر بسيطة أنني أستخدمها لتجربة Ajax.
def get_shifts_for_day(request,year,month,day):
data= dict()
data['d'] =year
data['e'] = month
data['x'] = User.objects.all()[2]
return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
هذا إرجاع ما يلي:
TypeError at /sched/shifts/2009/11/9/
<User: someguy> is not JSON serializable
إذا قمت بإخراج خط البيانات ['x'] حتى لا أشير إلى أي نماذج تعمل وإرجاع هذا:
{"e": "11", "d": "2009"}
لماذا لا يمكن تحليل Simplejson الخاص بي واحدة من نماذج Django الافتراضية؟ أحصل على نفس السلوك مع أي نموذج أستخدمه.
المحلول
تحتاج فقط إلى إضافة، في حياتك .dumps
اتصل، أ default=encode_myway
حجة للدعاية simplejson
تعرف ماذا تفعل عند تمرير بيانات تكنولوجيا المعلومات التي لا تعرف أنواعها - الإجابة على "لماذا" سؤالك هو بالطبع لم تفعل ذلك أخبر مسكين simplejson
ما يجب القيام به مع أحد حالات النماذج الخاصة بك.
وبالطبع تحتاج إلى الكتابة encode_myway
لتوفير بيانات JSON غير القابلة للتشفير، على سبيل المثال:
def encode_myway(obj):
if isinstance(obj, User):
return [obj.username,
obj.firstname,
obj.lastname,
obj.email]
# and/or whatever else
elif isinstance(obj, OtherModel):
return [] # whatever
elif ...
else:
raise TypeError(repr(obj) + " is not JSON serializable")
في الأساس، يعلم JSON عن أنواع البيانات الابتدائية للغاية (السلاسل والمغادرة والعوامات، وتجميعها في مجال الإصابات والقوائم) - إنها مسؤوليتك كمبرمج تطبيق لتتناسب مع كل شيء آخر في / من أنواع البيانات الأولية، وفي simplejson
هذا يحدث عادة من خلال وظيفة مرت إليها default=
في dump
أو dumps
زمن.
بدلا من ذلك، يمكنك استخدام json
Serializer هذا جزء من Django، انظر المستندات.