Django Serializer 응답에 추가 데이터를 포함시키는 방법은 무엇입니까?

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

  •  03-07-2019
  •  | 
  •  

문제

나는 django와 jquery와 함께 Livesearch를 만들려고 노력하고 있습니다. 내가 한 일은 javaScript가 getJson 함수를 사용하여 일부 데이터를 요청하게 만드는 것입니다. 그런 다음 Django에서 Django Serializer가 자동화 한 JSON 응답을 반환하는 뷰를 설정합니다.

그리고 이것은 잘 작동하며 텍스트/JavaScript 컨텐츠 유형으로 JSON 응답을 반환합니다. 모든 데이터를 보내지 않기 위해 (필요하지 않은 경우) 나는 이것을했다.

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

그러나 예를 들어, '장르'필드는 많은 분야의 분야이므로 장르 ID뿐만 아니라 장르에서 값을 얻을 수 있습니까?

그리고 모델에는 기능이 있습니다 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을 기반으로하며 직접 사용하고 모든 종류의 객체를 처리하기 위해 의지를 확장 할 수 있습니다. 따라서 여기에는 주로 두 가지 옵션이 있습니다. 관련 데이터가 포함 된 DICT 목록을 수동으로 구축하고 SimpleJson.dumps () (기본적으로 기본적으로 지원 문자열, 목록, dicts 및 숫자)로 전달하거나 방법을 아는 자신의 JSON 인코더를 작성하십시오. 특정 데이터 세트를 직렬화합니다. 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top