Django No. 16-3 데이터를 json 데이터 유형으로 프런트 엔드 페이지에 반환하는 방식

I. 소개

Django의 ORM 프레임 워크는 데이터베이스 테이블 데이터를 쿼리하는 많은 방법을 제공하며 다른 방법은 다른 결과를 반환합니다. 다른 방법은 고유 한 사용 시나리오를 가지고 있습니다.

일반적으로 사용되는 주요 쿼리 메서드의 수는 13 개이며 메서드 반환 값은 반복 가능한 객체입니다. QuerySet 메서드는 all (), filter (), exclude (), order_by (), reverse (), values ​​() , values_list (), distinct ();

프런트 엔드 직원이 인터페이스 반환 값의 데이터 유형이 json 인 것을 요구하는 경우 백 엔드 직원은 반복 가능한 객체 QuerySet의 값을 반복 불가능한 객체 및 비 json의 값으로 간접적으로 변환해야합니다. JsonResponse 클래스 초기화시 입력 매개 변수 중 하나의 값이면 JsonResponse 클래스 초기화 후의 객체를 최종 인터페이스 반환으로 프론트 엔드 직원에게 최종 제공 값.

인터페이스의 반환 값을 반복 가능한 객체 QuerySet의 값으로 간접적으로 다른 메서드를 통해 json 데이터 유형의 값으로 변환하는 소위 체계는 현재 세 가지 체계 만 있습니다 (이 세 가지만 기억하면 됨).

⑴. 옵션 1 : 시리얼 라이저 사용                                                 

     주요 기능 : 인터페이스의 반환 값을 반복 가능한 객체 QuerySet의 값으로 변환하여 json 데이터 유형의 값으로 변환합니다 (즉, 파이썬 언어의 데이터 유형은 문자열의 데이터 유형입니다).

    (이러한 종류의 프로그램은 기본적으로 필요하지 않고 이해하면됩니다.)

⑵. 옵션 2 : model_to_dict 사용                                           

     주요 기능 : 인터페이스의 반환 값을 반복 가능한 객체 QuerySet의 값으로 python 언어의 dict 데이터 유형 값으로 변환합니다.

    (이러한 종류의 프로그램은 기본적으로 필요하지 않고 이해하면됩니다.)

⑶. 스킴 3 : 메소드 목록과 결합 된 메소드 값 사용                         

     주요 기능 : 인터페이스의 반환 값을 반복 가능한 객체 QuerySet의 값으로 변환하여 Python 언어로 된 목록 데이터 유형의 데이터 유형 값으로 변환합니다.

    (이런 방식은 가장 간단합니다. 기본적으로 이것을 사용할 것입니다. 사용 방법을 아는 데 집중해야합니다.)

세부 묘사:

① 질문 : 뷰 함수가 반환하는 데이터의 데이터 타입이 프론트 엔드 페이지에 값을 반환하는 이유는 왜 때때로 json이어야합니까?

아마도 대답 :

현재 대부분의 회사 R & D 팀은 프로젝트 개발을 위해 프런트 엔드와 백 엔드를 분리하여 프로젝트 개발 및 유지 관리의 효율성을 크게 향상시킬 수 있습니다.

따라서 프런트 엔드 개발자는 일반적으로 인터페이스의 반환 값을 데이터 유형 json의 데이터로 변환하여 프런트 엔드 개발자에게 보내야하는 백 엔드 개발자를 요구합니다. 프런트 엔드 개발자는 데이터 유형 json의 데이터를 얻은 후 해당 html 페이지의 데이터로드 및 렌더링에 원하는 필드 데이터가 사용됩니다.

② 질문 : json의 데이터 유형을 이해하는 방법은 무엇입니까?

아마도 대답 :

json의 데이터 유형은 실제로 문자열입니다.

json의 데이터 유형은 미국 달러로 이해 될 수 있으며 전 세계 모든 국가에서 미국 달러로 거래 할 수 있습니다.

파이썬이 제공하는 모든 데이터 유형은 RMB로 이해 될 수 있고, Java가 제공하는 모든 데이터 유형은 유로로 이해 될 수 있으며, PHP가 제공하는 모든 데이터 유형은 일본 엔으로 이해 될 수 있으며, C 언어가 제공하는 모든 데이터 유형은 홍콩으로 이해 될 수 있습니다. Kong dollar., html에 필요한 데이터 유형은 json이어야합니다.

따라서 어떤 백엔드 언어로 쓰여진 인터페이스 반환 값에 관계없이 프런트 엔드 직원이 인터페이스 반환 값의 데이터 유형이 json이어야하는 경우 백엔드 직원은 인터페이스 반환 값의 데이터 유형을 변환해야합니다. 즉, 원래 데이터 유형 (예 : python The language list data type / dict data type)을 변환하여 최종 인터페이스 반환 값으로 간주되기 전에 json 데이터 유형으로 변환 할 수 있습니다.

 

둘째, JsonResponse 클래스의 소스 코드에 대한 간단한 분석

세부 묘사:

①.json은 현재 일반적으로 사용되는 데이터 형식입니다. 때로는 백엔드 개발자가 json 형식의 데이터를 프런트 엔드 개발자에게 반환해야하며 JsonResponse 클래스가 이러한 요구를 충족 할 수 있습니다.

② [from django.http import JsonResponse]와 [class JsonResponse (HttpResponse)]를 통해 JsonResponse 클래스가 HttpResponse의 하위 클래스이며 부모 클래스로부터 대부분의 동작을 상속 받아 json 응답 생성에 도움이됨을 알 수 있습니다.

1. JsonResponse 클래스의 소스 코드는 다음과 같습니다.

class JsonResponse(HttpResponse):

    """

    An HTTP response class that consumes data to be serialized to JSON.



    :param data: Data to be dumped into json. By default only ``dict`` objects

      are allowed to be passed due to a security flaw before EcmaScript 5. See

      the ``safe`` parameter for more information.

    :param encoder: Should be a json encoder class. Defaults to

      ``django.core.serializers.json.DjangoJSONEncoder``.

    :param safe: Controls if only ``dict`` objects may be serialized. Defaults

      to ``True``.

    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().

    """



    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,

                 json_dumps_params=None, **kwargs):

        if safe and not isinstance(data, dict):

            raise TypeError(

                'In order to allow non-dict objects to be serialized set the '

                'safe parameter to False.'

            )

        if json_dumps_params is None:

            json_dumps_params = {}

        kwargs.setdefault('content_type', 'application/json')

        data = json.dumps(data, cls=encoder, **json_dumps_params)

        super().__init__(content=data, **kwargs)

2. JsonResponse 클래스 생성자에서 각 매개 변수의 일반적인 의미와 기능

① 입력 매개 변수 [data] : 데이터 타입 dict의 값을 전달해야하며 (데이터 타입 dict의 값을 전달할 수 없습니다) json 형식의 데이터로 변환됩니다.   

② 입력 매개 변수 [encoder] : 기본값은 django.core.serializers.json.DjangoJSONEncoder 또는 DjangoJSONEncoder로 데이터를 직렬화하는 데 사용됩니다. (직렬화에 대한 자세한 내용은 Baidu에서 json 직렬화를 검색하여 학습 할 수 있습니다. 현재 사용 방법 만 알면됩니다.) ③ Entry [safe] : 기본값은 True입니다. 값이 False로 설정되어 있으면 모든 개체 (예 : 목록 / 튜플 / dict)를 직렬화에 전달할 수 있음을 의미합니다. 값이 True로 설정되고 첫 번째 매개 변수 데이터의 값이 dict 개체가 아닌 경우 TypeError가 발생합니다. 

④ 입력 매개 변수 [json_dumps_params] : 기본값은 None입니다. django1.9 버전에서 새로 추가 된 입력 매개 변수의 경우 Python의 json 라이브러리에서 json.dump () 메서드로 처리 된 객체를 입력 매개 변수 값으로 입력 매개 변수에 전달하여 응답을 생성 할 수 있습니다. (그것을 이해하다)

3. [Scheme 1 : 시리얼 라이저 사용] 특정 계획 실현 프로세스

1. 첫 번째 단계 : 먼저 관련 코드 내용의보기 기능을 작성합니다.

관련 코드 :


from django.core import serializers

import json

from django.http import JsonResponse





def search_person(request):

    # 第一种返回给前端页面的是json数据类型的方案:使用【serialize】

    data = {}

    a = Person.objects.all()

    b = serializers.serialize("json", a)

    print(type(b))

    print(b)

    print("================================分割线1===================================")

    c = json.load(b)

    print(type(c))

    print(c)

    print("================================分割线2===================================")

    data["result"] = c

    print(data["result"])

    print(data)

    print("================================分割线3===================================")

    d = JsonResponse(data, json_dumps_params={"ensure_ascii": False})



    print(type(d))

    print(d)

    print(d.content)

    return JsonResponse(data, json_dumps_params={"ensure_ascii": False})

2. 2 단계 : 브라우저에서 [ http://127.0.0.1:8000/search_person ] 웹 사이트를 방문 하여 결과 페이지에서 데이터 표시를 확인합니다.

3. 세 번째 단계 : 분석 및 형식화를 위해 웹 사이트 [https://www.json.cn/]에서 인터페이스 반환 값을 얻을 수 있으므로 육안 검사에 편리합니다.

4. 4 단계 : 인쇄 된 로그 정보를 확인하여 예상 결과를 충족하는지 확인합니다.

4. [Scheme 2 : Use model_to_dict] 특정 계획 실현 프로세스

1. 첫 번째 단계 : 먼저 관련 코드 내용의보기 기능을 작성합니다.


관련 코드 :

From django.forms import model_to_dict



def search_person(request):

    # 第二种返回给前端页面的是json数据类型的数据方案:【方案2:使用方法model_to_dict】

    res = Person.objects.all()

    json_list = []

    for i in res:

        json_dict = model_to_dict(i)

        json_list.append(json_dict)

    print(json_list)

    return JsonResponse(json_list, safe=False, json_dumps_params={"ensure_ascii": False})

2. 2 단계 : 브라우저에서 [ http://127.0.0.1:8000/search_person ] 웹 사이트를 방문 하여 결과 페이지에서 데이터 표시를 확인합니다.

3. 3 단계 : 인쇄 된 로그 정보를 확인하여 예상 결과를 충족하는지 확인합니다.

5. [Scheme 3 : 방법 목록과 결합 된 방법 값 사용] 특정 계획 실현 프로세스

1. 첫 번째 단계 : 먼저 관련 코드 내용의보기 기능을 작성합니다.


관련 코드 :

def search_person(request):

    # 第三种返回给前端页面的是json数据类型的数据方案:【方案3:使用方法value()跟方法list结合】

    res = Person.objects.all().values()

    print(type(res))

    print(res)

    print("================================分割线1===================================")

    res = list(res)

    print(type(res))

    data = {"result": res}

    print(data)

    print("================================分割线2===================================")

    return JsonResponse(data, json_dumps_params={"ensure_ascii": False})

2. 2 단계 : 브라우저에서 [ http://127.0.0.1:8000/search_person ] 웹 사이트를 방문 하여 결과 페이지에서 데이터 표시를 확인합니다.

3. 3 단계 : 인쇄 된 로그 정보를 확인하여 예상 결과를 충족하는지 확인합니다.

세부 묘사:

①. [Scheme 3 : 메소드리스트와 결합 된 메소드 값 () 사용]이 주류이며 일반적으로 사용되는 솔루션이며, 플랫폼 개발시 가능한 한이 솔루션 3을 선택할 수 있습니다.

추천

출처blog.csdn.net/LYX_WIN/article/details/114405004