day 82 Serializer Basic serialization class with the class of anti-Series

A route:

from django.contrib import admin
from api import views
from django.views.static import serve
from d_proj import settings

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api1/', include('api1.urls')),
    url(r'^media/(?P<path>.*)', serve, {'document_root':settings.MEDIA_ROOT}),]
View Code

 

Two routes

from django.conf.urls import url
from django.contrib import admin
from api1 import views

urlpatterns = [
    url(r'^users/$', views.Users.as_view()),
    url(r'^users/(?P<pk>\d+)/$', views.Users.as_view()),


]
View Code

 

models.py

from django.db import models

class User(models.Model):
    CHOICE_SEX = (
        (0, ''),
        (1, '')
    )
    name = models.CharField(max_length=32, verbose_name="姓名")
    pwd = models.CharField(max_length=32,verbose_name="密码")
    sex = models.SmallIntegerField(choices=CHOICE_SEX, default=0)
    create_time = models.DateTimeField(auto_now_add=True, blank=True)
    is_delete = models.BooleanField(default=False)

    class Meta:
        db_table = 'F_user'
        verbose_name_plural = "用户名"

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

 

views.py

# Write restful interface is based on django Rest Framework framework DRF 
# DRF use: 
# 1 in setting.py in the rest_framework added to the app in 
# 2, you write all written CBV, inherited APIView 

# APIview Why rest_framework of? 

From rest_framework.views Import APIView
 from rest_framework.response Import the Response
 from .api1_serializer Import UserSerializer, UserDserializer
 from API1 Import Models 

from rest_framework.request Import Request
 from django.http Import Request
 classThe Users (APIView): 
    back_dic = {
         ' Status ' : None,
         ' MSG ' : '' ,
         ' Result ' : {} 
    } 
    # Get all resources 
    DEF GET (Self, Request, * args, ** kwargs): 
        PK = kwargs .get ( ' PK ' , None)
         IF PK:
             # obtaining a 
            users_query = models.User.objects.filter (PK = PK, is_delete = False)
         the else : 
            users_query= models.User.objects.filter(is_delete=False).all()
        if users_query:
            # instance = query_list , many=True
            # instance = query_obj, many=False
            userser = UserSerializer(instance=users_query, many=True)
            self.back_dic['result'] = userser.data
            self.back_dic['msg'] = '查询成功'
            self.back_dic['status'] = '0'
        else:
            self.back_dic[' MSG ' ] = ' query fails, the search does not exist ' 
            self.back_dic [ ' Status ' ] = ' . 1 ' 
        return the Response (self.back_dic) 

    # add a resource 
    DEF POST (Self, Request, args *, ** kwargs): 

        # models.User.objects.create (** request.data) 
        # stored data needs to be verified before data can define a series of anti-class, 
        user_deser = UserDserializer (data = request.data) 

        # when raise_exception = True to directly verify the information back to the front desk unlawful 
        # user_deser.is_valid (raise_exception = True) 

        IF user_deser.is_valid ():
             #Must pass before they can call to check anti-serialization class to write their own create method 
            # direct transfer method create your own, you can also adjust the save method, the method will save the create method to tune 
            # RET = user_deser.create (user_deser.validated_data) 
            RET = user_deser.save () 

            self.back_dic [ ' Status ' ] = 0 
            self.back_dic [ ' MSG ' ] = ' new success ' 
            self.back_dic [ ' Result ' ] = UserSerializer (= instance RET) .data
             return the Response ( self.back_dic)
         the else : 
            self.back_dic [ ' Status' ] =. 1 
            self.back_dic [ ' MSG ' ] = ' Add failed ' 
            self.back_dic [ ' Result ' ] = user_deser.errors
             return the Response (self.back_dic) 

    # update a need to customize the update method 
    DEF PUT (Self , Request, * args, ** kwargs):
         # modified object query_list] [ 
        # update_query = models.User.objects.filter (kwargs.get PK = ( 'PK', None)) 
        # user_ser = UserDserializer (= update_query instance , Data = request.data) 

        # modified object [] query_obj
        = models.User.objects.filter update_query_obj (kwargs.get PK = ( ' PK ' ., None)) First () 
        user_ser = UserDserializer (= update_query_obj instance, Data = request.data) 

        IF user_ser.is_valid ():
             # ret_query user_ser.update = (= update_query instance, validated_data = user_ser.validated_data) 
            # directly update their modulation method, may be adjusted save method, you will save method to create modulation method 
            ret_query = user_ser.save () 
            self.back_dic [ ' Status ' ] = 0 
            self.back_dic [ ' MSG ' ] = ' update success '
            # 【query_list】
            # self.back_dic['result'] = UserSerializer(instance=ret_query, many=True).data

            #[query_obj]
            self.back_dic['result'] = UserSerializer(instance=ret_query,many=False).data
        else:
            self.back_dic['status'] = 1
            self.back_dic['msg'] = '更新失败'
            self.back_dic['result'] = user_ser.errors
        return Response(self.back_dic)

    def delete(self, request, *args, **kwargs):
        models.User.objects.filter(pk=kwargs.get('pk'), is_delete=False).update(is_delete=True)

        return  Response('delete ok')
View Code

 

Serialization and anti-serialization

from rest_framework Import serializers
 from . Import Models 


class UserSerializer (serializers.Serializer): 
    name = serializers.CharField () 
    pwd = serializers.CharField () 

    the create_time = serializers.DateTimeField () 

    Gender = serializers.SerializerMethodField () # can be custom serialization properties (Model class attributes and does not require synchronization) 
    DEF get_gender (self, obj):   # obj involved serialized class object Model 
        # return obj.sex 0 or # 1 
        # return value of the function corresponds to a custom data sequence the value of the 
        return obj.get_sex_display ()

class UserDserializer (serializers.Serializer): 
    name = serializers.CharField (= 32 MAX_LENGTH, min_length = 2, error_messages, = {
         ' MAX_LENGTH ' : ' name too long ' ,
         ' min_length ' : ' name is too short ' , 
    }) 
    pwd = serializers .CharField (MAX_LENGTH = 32 ) 
    Gender = serializers.IntegerField (Source = ' Sex ' ) 

    # does not allow verification = False the requires 
    the create_time = serializers.DateTimeField (required = False) # is not necessary 

    #Model class object to provide new interface function for post 
    DEF Create (Self, validated_data):
         Print ( ' Create been performed ' ) 
        Re = models.User.objects.create (** self.validated_data)
         # objects need to be created trying to return to the function that returns to the foreground 
        return Re 

    # to put provide updates Model class object 
    DEF update (Self, instance, validated_data):
         # update QUERY_LIST 
        # instance.update (** validated_data) 

  
        instance.name = validated_data.get ( ' name ' ) 
        instance.pwd = validated_data.get ( ' pwd')
        instance.sex = validated_data.get('sex')
        instance.save()
        return instance
View Code

 

Guess you like

Origin www.cnblogs.com/qingqinxu/p/11372578.html