感謝alex和武沛齊老師html
rest_framework中的序列化表示數據庫
from rest_framework import serializersclass RoleSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField()class RolesView(APIView): def get(self, request, *args, **kwargs): #方式1 #roles = models.Role.objects.all().values('id','title') #roles = list(roles) #ret = json.dumps(roles, ensure_ascii=False) #方式2 對queryset的格式進行序列化 roles = models.Role.objects.all() ser = RolesSerializer(instance=roles, many=True) ret = json.dumps(ser.data, ensure_ascii=False) return HttpResponse(ret) #方式2 單個對象 roles = models.Role.objects.all().first() ser = RolesSerializer(instance=roles, many=False) #ser.data 已是完成序列化的結果了 ret = json.dumps(ser.data, ensure_ascii=False) return HttpResponse(ret)def func(arg): if callable(arg): print(arg()) else: print(arg)func(123)func(lambda:"666")序列化 部分總結: 1.寫類 繼承下面兩種 class RolesSerializer(serializers.Serializer): id = serializers.IntegerFiled() title = serializers.CharField() class UserInfoSerializer(serializers.ModelSerializer): class Meta: model = models.UserInfo #fileds = "__all__" fields = ['id', 'username', 'password'] 2.字段 a. title = serializers.CharField(source = 'group.title') b. title = serializers.SerializerMethodField() class UserInfoSerializer(serializers.ModelSerializer): rls = serializers.SerializerMethodField() #自定義顯示 class Meta: model = models.UserInfo fields = ['id', 'username', 'password', 'rls',] #自定義方法 def get_rls(self, row) role_obj_list = row.roles.all() ret = [] for item in role_obj_list: ret.append({'id':item.id, 'title':item.title}) return ret c.自定義類 不過用得少視圖函數中from cmdb import modelsfrom rest_framework import serializers#方式1 序列化# class UserInfoSerializer(serializers.Serializer):# username = serializers.CharField()# password = serializers.CharField()# xxxx = serializers.CharField(source="user_type") #source表示對應數據庫的某個字段 此時就能夠改變變量了 row.get_user_type_display 不可執行# oooo = serializers.CharField(source="get_user_type_display") #對choices數據進行獲取中文 可執行## group = serializers.CharField(source="group.title") #foreignkey 進行.操做 跨表# #rls = serializers.CharField(source='roles.all')# #若是是單個表和foreignkey能夠經過source去指定 不能指定manytomany## rls = serializers.SerializerMethodField()#自定義顯示# def get_rls(self, row):# role_obj_list = row.roles.all()# ret = []# for item in role_obj_list:# ret.append({'id':item.id,"title":item.title})# return ret#方式2 #地址 www.cnblogs.com/wupeiqi/articles/7805382.html#方式2能夠與方式1中的數據混合着使用class UserInfoSerializer(serializers.ModelSerializer): oooo = serializers.CharField(source="get_user_type_display") rls = serializers.SerializerMethodField() group = serializers.CharField(source='group.title') class Meta: model = models.UserInfo #fields = "__all__" #這一步已經能夠完成基本的全部數據的顯示 fields = ['id','username','password','oooo','rls','group'] def get_rls(self, row): role_obj_list = row.roles.all() ret = [] for item in role_obj_list: ret.append({'id':item.id, 'title':item.title}) return retimport jsonclass UserInfoView(APIView): def get(self, request, *args, **kwargs): users = models.UserInfo.objects.all() ser = UserInfoSerializer(instance=users,many=True) print(ser.data) ret = json.dumps(ser.data, ensure_ascii=False) return HttpResponse(ret) urls.py中 from django.conf.urls import url,includefrom cmdb import viewsurlpatterns = [ url(r'^(?P<version>[v1|v2]+)/userinfo/$',views.UserInfoView.as_view()),]models.py中from django.db import models# Create your models here.class UserGroup(models.Model): title = models.CharField(max_length=32)class UserInfo(models.Model): user_type_choices = ( (1,'普通用戶'), (2,'VIP'), (3,'SVIP'), ) user_type = models.IntegerField(choices=user_type_choices) group = models.ForeignKey(to="UserGroup", on_delete=models.CASCADE) username = models.CharField(max_length=32, unique=True) password = models.CharField(max_length=64) roles = models.ManyToManyField(to="Role")class UserToken(models.Model): user = models.OneToOneField(to="UserInfo", on_delete=models.CASCADE) token = models.CharField(max_length=64)class Role(models.Model): title = models.CharField(max_length=32)