1. 程式人生 > >rest_framework 序列化

rest_framework 序列化

role ini 序列 ins clas tar ons onetoone pla

serializer.py

技術分享圖片
#/usr/bin/env python3
# -*- coding:utf-8 -*-
#   mail: [email protected]

from app01.models import UserGroup,UserInfo,Role
from rest_framework import  serializers
from app01 import models

class UserInfoSerializer(serializers.Serializer):
    ut=serializers.CharField(source=get_user_type_display
) username=serializers.CharField() password=serializers.CharField() group=serializers.CharField(source=group.title) rls=serializers.SerializerMethodField() # 或models中定制方法source參數引用 def get_rls(self,row): role_obj_list=row.roles.all() ret=[] for item in
role_obj_list: ret.append({id:item.id,tile:item.title}) return ret class UserInfoSerializer2(serializers.ModelSerializer): ut = serializers.CharField(source=get_user_type_display) group=serializers.CharField(source=group.title) 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,tile:item.title}) return ret class Meta: model=models.UserInfo # fields=‘__all__‘ fields=[id,username,password,ut,group,rls] class UserInfoSerializer3(serializers.ModelSerializer): class Meta: model=models.UserInfo # fields=‘__all__‘ fields=__all__ depth = 1 # Foreignkey和manytomany 自動獲取詳細。 choice仍需手動處理 class XXX: def __init__(self,base): self.base=base def __call__(self, value): if not value.startwith(self.base): message=false raise serializers.ValidationError(message) class UserInfoSerializerXXX(serializers.Serializer): # 校驗字段 name=serializers.CharField(error_messages={required:標題不能為空}) # 利用validators XX=serializers.CharField(validators=[XXX(basename)]) # 利用hook xx2=serializers.CharField() def validate_xx2(self,value): if value: return value # from rest_framework import exceptions # raise exceptions.ValidationError(‘xxx‘)
View Code

views.py

技術分享圖片
from django.shortcuts import render,HttpResponse

# Create your views here.
from app01.models import UserGroup,UserInfo,Role
from rest_framework.views import APIView

from rest_framework.versioning import  QueryParameterVersioning,URLPathVersioning
from django.urls import reverse
from rest_framework.parsers import JSONParser,FormParser
from app01.serializer import UserInfoSerializer,UserInfoSerializer2,UserInfoSerializer3,UserInfoSerializerXXX
import json

class D(APIView):

    versioning_class = URLPathVersioning
    parser_classes=[JSONParser,FormParser]   # print(request.data)
    def get(self,request,*args,**kwargs):
        print(kwargs.get(version))
        print("##")
        print(request.version)
        print(request.versioning_scheme.reverse(viewname=userapi,request=request))
        r=reverse(viewname=userapi,kwargs={version:v1})
        print(r)
        print(request.body)
        return HttpResponse(ok)

    def post(self,request,*args,**kwargs):
        # self.dispatch()
        print(request._request)
        pass



class SerView(APIView):
    def get(self, request, *args, **kwargs):
        userinfo_obj=UserInfo.objects.all()
        ser=UserInfoSerializer3(instance=userinfo_obj,many=True)
        ret=json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

    def post(self, request, *args, **kwargs):
        ser=UserInfoSerializerXXX(data=request.data)
        if ser.is_valid():
            print(ser.validated_data)
        else:
            print(ser.errors)
        return HttpResponse(wrong)
View Code

models.py

技術分享圖片
#/usr/bin/env python3
# -*- coding:utf-8 -*-
#   mail: [email protected]
from django.db import models
from rest_framework import request

class UserGroup(models.Model):
    title=models.CharField(max_length=32)

    def __str__(self):
        return self.title


class UserInfo(models.Model):
    user_type_choice=((1,普通用戶),
                      (2,vip),
                      (3,SVIP))
    user_type = models.IntegerField(choices=user_type_choice)
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
    group=models.ForeignKey(UserGroup,on_delete=None)
    roles=models.ManyToManyField(Role)

    def __str__(self):
        return self.username

class UserToken(models.Model):
    user=models.OneToOneField(UserInfo,on_delete=None)
    token=models.CharField(max_length=64)

    def __str__(self):
        return self.token


class Role(models.Model):
    title=models.CharField(max_length=32)

    def __str__(self):
        return self.title
View Code

rest_framework 序列化