كيفية تضمين بيانات إضافية في الاستجابة مسلسل جانغو؟

StackOverflow https://stackoverflow.com/questions/413603

  •  03-07-2019
  •  | 
  •  

سؤال

واني اسعى الى تقديم livesearch مع جانغو ومسج. ما قمت به هو جعل جافا سكريبت طلب بعض البيانات مع وظيفة getJSON، ثم انني قمت بإعداد عرض في جانغو التي تقوم بإرجاع استجابة JSON الآلي من مسلسل جانغو.

وهذا يعمل بشكل جيد، فإنها ترجع استجابة سلمان مع النص / جافا سكريبت نوع المحتوى. لتجنب إرسال جميع البيانات، (الكثير أنني لا حاجة) فعلت هذا:

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

ولكن على سبيل المثال، الحقل "النوع" هو حقل manyToMany، لذلك هل من الممكن الحصول على قيم من genre.all.0 على سبيل المثال وليس فقط ID النوع؟

ونموذج لديه get_absolute _url وظيفة، هل من الممكن أن يدرج هذا في استجابة JSON، إذا كان الأمر كذلك كيف؟

وهكذا اعتقد سؤالي هو، هل من الممكن أن تشمل غيرها من الاشياء من البيانات الميدانية الأولية في استجابة JSON، إن لم يكن، كيف يمكنك أن تذهب نحو حل مشكلتي؟

هل كانت مفيدة؟

المحلول 3

وتبين لي أن أبسط شيء هو عدم استخدام مسلسل على الإطلاق. أنا لا أعرف لماذا لم أفكر في هذا من قبل، ولكن كنت فقط عرض قائمة الكائن عام وغيرت MIMETYPE إلى نص / جافا سكريبت وجعل قالب JSON insted من قالب أتش تي أم أل.

وبسيط جدا، وبهذه الطريقة تمكنت من الحصول على جميع البيانات أردت في استجابة 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')

نصائح أخرى

ويستند JSON التسلسل جانغو على simplejson، والتي يمكنك استخدامها مباشرة وتمديد في الإرادة للتعامل مع أي نوع من الكائنات. ولذلك عليك أن معظمهم خيارين هنا: إما بناء قائمة من dicts مع البيانات ذات الصلة يدويا وتمريرها إلى simplejson.dumps () (والتي افتراضيا سلاسل الدعم، والقوائم، وdicts numerics)، أو إكبس سلمان التشفير الخاصة التي تعرف كيف تسلسل بيانات محددة. FWIW، وهنا (وليس اختبارها بشكل جيد ولكن عملت حتى الآن) نموذج جانغو علم سلمان التشفير:

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

وهناك جانغو مفيد التطبيق طرف ثالث / مسلسل من شأنها أن تسمح لك لتشمل بيانات إضافية. كما يسمح لك لتشمل علاقات نموذجية واستبعاد قائمة من المجالات.

وأنها متاحة في http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top