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)
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)
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
在Meta里面制定对应的模型和字段,但ModelSerializer只能实现简单的展现,复杂的展现还须要本身定制python
depth:深度追踪ios
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里面加上加上depth = 1,就能够去取它对应的关联表的的下一层的全部数据,depth为几就去找几层数据库