rest_framework- serialization -1

Serialization

  • Define model classes
from django.db import models


# Create your models here.

class StuModel(models.Model):
    SEX_CHOICES = (
        (0, '女'),
        (1, '男'),
    )

    name = models.CharField(max_length=10)
    sex = models.SmallIntegerField(choices=SEX_CHOICES, null=True)
    group = models.ForeignKey('Group', on_delete=models.SET_NULL, null=True)
    role = models.ManyToManyField('Roles')


class Group(models.Model):
    name = models.CharField(max_length=10)


class Roles(models.Model):
    name = models.CharField(max_length=10)

  • View function
from django.shortcuts import render

# Create your views here.

from rest_framework import serializers
from rest_framework.views import APIView
from .models import *
from django.http import HttpResponse

import json


class MySerializer(serializers.Serializer):
    name = serializers.CharField()  # 普通查询
    sex_field = serializers.IntegerField(source='sex')  # 更改名称查询
    sex = serializers.CharField(source='get_sex_display')  # 内嵌chiose查询
    group = serializers.CharField(source='group.name')  # 关联查询
    rol = serializers.SerializerMethodField()  # manyToMany查询

    def get_rol(self, row):
        queryset = row.role.all()
        resp = []
        for item in queryset:
            resp.append(
                {
                    'id': item.id,
                    'name': item.name
                },
            )
        return resp


class MyView(APIView):

    def get(self, request):
        queryset = StuModel.objects.all()
        serializer = MySerializer(instance=queryset, many=True)
        ret = json.dumps(serializer.data)
        return HttpResponse(ret)

  • Custom serialization objects
    • Since serialized objects defined must inherit serializers.Serializer
    • The field names and types of objects to be serialized and the serialized object to be the same as
      • If you want to customize field names, you need to type the field name inside with a database source =
      • -Many query needs to use a field to the class instance SerializerMethodField
        - defined get_ {field_name} way to achieve customized queries on the inside
    • Custom serialization object is instantiated, the object to be serialized queryset assigned to the object instance attribute, when more than one object is queryset, many = True
  • Serialized object model
class MySerializer(serializers.ModelSerializer):
    # name = serializers.CharField()  # 普通查询
    # sex_field = serializers.IntegerField(source='sex')  # 更改名称查询
    # sex = serializers.CharField(source='get_sex_display')  # 内嵌chiose查询
    group = serializers.CharField(source='group.name')  # 关联查询
    rol = serializers.SerializerMethodField()  # manyToMany查询

    class Meta:
        model = StuModel
        fields = ['name', 'sex_field', 'sex', 'group', 'rol']
        extra_kwargs = {
            'sex_field': {'source': 'sex'},
            'sex': {'source': 'get_sex_display'},
        }

    def get_rol(self, row):
        queryset = row.role.all()
        resp = []
        for item in queryset:
            resp.append(
                {
                    'id': item.id,
                    'name': item.name
                },
            )
        return resp
  • Model serialization needs to inherit ModelSerializer
  • You can customize additional properties in extra_kwargs, reference Serializer
  • Develop models and corresponding fields in Meta inside, but ModelSerializer can only achieve a simple display, showing complex also needs its own custom

  • depth: Depth Track

class MySerializer(serializers.ModelSerializer):


    class Meta:
        model = StuModel

        fields = '__all__'
        depth = 1




class MyView(APIView):

    def get(self, request):
        queryset = StuModel.objects.all()
        serializer = MySerializer(instance=queryset, many=True)
        ret = json.dumps(serializer.data)
        return HttpResponse(ret)

Meta plus the inside with depth = 1, it may fetch the corresponding relation table of all the data layer, depth of several layers went

Guess you like

Origin www.cnblogs.com/ivy-blogs/p/11654038.html