什么是序列化与反序列化

"""
序列化:对象转换为字符串用于传输
反序列化:字符串转换为对象用于使用
"""

drf序列化与反序列化

"""
序列化:Model类对象转换为字符串用于传输
反序列化:字符串转换为Model类对象用于使用
"""

Model类

创建数据库:终端
>: mysql -uroot -p密码
>: create database 数据库名 charset=utf8
配置数据库:settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER': 'root',
'PASSWORD': '密码'
}
}
修改操作数据库的模块:项目init文件
import pymysql
pymysql.install_as_MySQLdb()
创建model类:models.py
from django.db import models
class User(models.Model):
CHOICE_SEX = (
(0, '男'),
(1, '女')
)
name = models.CharField(max_length=32, verbose_name='姓名')
password = models.CharField(max_length=64, verbose_name='密码')
sex = models.SmallIntegerField(choices=CHOICE_SEX, default=0)
create_time = models.DateTimeField(auto_now_add=True, blank=True)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
注册model类:admin.py
from django.contrib import admin
from api.models import User
admin.site.register(User)
数据库迁移:在项目目录下的终端
>: python3 manage.py makemigrations
>: python3 manage.py migrate
注册超级用户:在项目目录下的终端
>: python3 manage.py createsuperuser
登陆admin页面添加数据:浏览器
http://localhost:8000/admin/

路由分发

项目urls.py
from django.conf.urls import url, include
from django.contrib import admin urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^api/', include('api.urls'))

]

api应用urls.py
from django.conf.urls import url
urlpatterns = [ ]

获取多资源 接口

序列化类:serializers.py
from rest_framework import serializers

# 为每一个Model类至少配一个Serializer类

class UserSerializer(serializers.Serializer):

# 序列化一个Model类对象,其实就是序列化该类的每一个属性

name = serializers.CharField()

password = serializers.CharField()

sex = serializers.IntegerField()

create_time = serializers.DateTimeField()

视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个

class UsersAPIView(APIView):

def get(self, request, *args, **kwargs):

user_list = User.objects.all()
    <span class="hljs-comment"># instance存放的是queryset对象,many需要设置为True</span>
user_data = UserSerializer(instance=user_list, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
)</code></pre>

序列化字段操作(自定义字段)

序列化类修订:serializers.py
from rest_framework import serializers

# 为每一个Model类至少配一个Serializer类

class UserSerializer(serializers.Serializer):

# 序列化一个Model类对象,其实就是序列化该类的每一个属性

# 注意1:Model类与Serializer类是通过属性名建立关联的 - 属性名必须依照

name = serializers.CharField()

password = serializers.CharField()

# sex = serializers.IntegerField()

# 注意2:不需要通过给前台的数据,不需要提供该属性的序列化

# create_time = serializers.DateTimeField()
<span class="hljs-comment"># 注意3:serializers.SerializerMethodField()可以产生自定义序列化属性(不需要和Model类属性同步),</span>
<span class="hljs-comment"># 但要为其绑定一个提供值的函数,函数名为 get_属性(self, obj) (obj为参与序列化的Model类对象)</span>
gender = serializers.SerializerMethodField()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_gender</span><span class="hljs-params">(self, obj)</span>:</span>
<span class="hljs-comment"># 该函数的返回值就作为对应自定义数据序列化后的值</span>
<span class="hljs-keyword">return</span> obj.get_sex_display()</code></pre>

新增单资源 接口

序列化类(反序列化类):serializers.py
from rest_framework import serializers
from .models import User class UserDeserializer(serializers.Serializer):

name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={

'max_length': '姓名太长',

'min_length': '姓名太短'

})

password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={

'max_length': '密码太长',

'min_length': '密码太短'

})

sex = serializers.IntegerField()

# required=False该字段前台可以不用传(不参与校验)

create_time = serializers.DateTimeField(required=False)
<span class="hljs-comment"># 完成ORM的操作</span>
<span class="hljs-comment"># def save(self): # 不能直接重写save,因为系统的save可以完成新增或修改</span>
<span class="hljs-comment"># # print(self.validated_data)</span>
<span class="hljs-comment"># User.objects.create(**self.validated_data)</span> <span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data)</code></pre>
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个

class UsersAPIView(APIView):

# 新增一个资源

def post(self, request, *args, **kwargs):

user_deser = UserDeserializer(data=request.data)

# raise_exception值为True,当校验失败,直接返回校验失败的错误信息

# result = user_deser.is_valid(raise_exception=True)

result = user_deser.is_valid()

if result:

new_user_obj = user_deser.save()

return Response({

'status': 0,

'msg': 'success',

'result': UserSerializer(new_user_obj).data

})

else:

return Response({

'status': 1,

'msg': 'failed',

'results': user_deser.errors

})

更新单资源 接口

序列化类(反序列化类):serializers.py
from rest_framework import serializers
from .models import User class UserDeserializer(serializers.Serializer):

name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={

'max_length': '姓名太长',

'min_length': '姓名太短'

})

password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={

'max_length': '密码太长',

'min_length': '密码太短'

})

sex = serializers.IntegerField()

# required=False该字段前台可以不用传(不参与校验)

create_time = serializers.DateTimeField(required=False)
<span class="hljs-comment"># 完成ORM的操作</span>
<span class="hljs-comment"># def save(self): # 不能直接重写save,因为系统的save可以完成新增或修改</span>
<span class="hljs-comment"># # print(self.validated_data)</span>
<span class="hljs-comment"># User.objects.create(**self.validated_data)</span> <span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data) <span class="hljs-comment"># 为put接口提供更新Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update</span><span class="hljs-params">(self, instance, validated_data)</span>:</span>
<span class="hljs-comment"># 操作model对象</span>
<span class="hljs-comment"># instance.name = validated_data.get('name')</span>
<span class="hljs-comment"># instance.password = validated_data.get('password')</span>
<span class="hljs-comment"># instance.sex = validated_data.get('sex')</span>
<span class="hljs-comment"># instance.save()</span>
<span class="hljs-comment"># 操作queryset对象</span>
instance.update(**validated_data)
<span class="hljs-keyword">return</span> instance</code></pre>
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个

class UsersAPIView(APIView):

# 更新一个资源

def put(self, request, *args, **kwargs):

# 要更新的资源的主键

pk = kwargs.get('pk')
    <span class="hljs-comment"># 操作更新时可以选择操作 queryset对象 或 model对象</span>
<span class="hljs-comment"># 操作model对象</span>
<span class="hljs-comment"># old_user_obj = User.objects.get(pk=pk)</span>
<span class="hljs-comment"># user_deser = UserDeserializer(instance=old_user_obj, data=request.data)</span> <span class="hljs-comment"># 操作queryset对象</span>
old_user_query = User.objects.filter(pk=pk)
user_deser = UserDeserializer(instance=old_user_query, data=request.data) <span class="hljs-comment"># raise_exception值为True,当校验失败,直接返回校验失败的错误信息</span>
<span class="hljs-comment"># result = user_deser.is_valid(raise_exception=True)</span>
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
<span class="hljs-comment"># new_user_obj = user_deser.save() # 操作model对象</span>
new_user_query = user_deser.save() <span class="hljs-comment"># 操作queryset对象</span>
new_user_obj = new_user_query.first()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
})</code></pre>

删除单资源 接口

重构Model新增字段:models.py
class User(models.Model):
CHOICE_SEX = (
(0, '男'),
(1, '女')
)
name = models.CharField(max_length=32, verbose_name='姓名')
password = models.CharField(max_length=64, 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)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
数据库迁移:在项目目录下的终端
>: python3 manage.py makemigrations
>: python3 manage.py migrate
视图类接口:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个

class UsersAPIView(APIView):

# 删除一个资源

def delete(self, request, *args, **kwargs):

pk = kwargs.get('pk')

try:

delete_user_obj = User.objects.get(pk=pk, is_delete=False)

# 完成删除信息的更新

delete_user_obj.is_delete = True

delete_user_obj.save()

return Response()

except:

return Response({

'status': 1,

'msg': '数据删除失败'

})

获取单资源 接口

序列化类:serializers.py
from rest_framework import serializers

# 为每一个Model类至少配一个Serializer类

class UserSerializer(serializers.Serializer):

# 序列化一个Model类对象,其实就是序列化该类的每一个属性

name = serializers.CharField()

password = serializers.CharField()

sex = serializers.IntegerField()

create_time = serializers.DateTimeField()

视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个

class UsersAPIView(APIView):

def get(self, request, *args, **kwargs):

pk = kwargs.get('pk', None)
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> pk:
user_query = User.objects.filter(is_delete=<span class="hljs-keyword">False</span>).all()
<span class="hljs-keyword">else</span>:
user_query = User.objects.filter(is_delete=<span class="hljs-keyword">False</span>, pk=pk)
<span class="hljs-comment"># 如果只操作一个对象,many参数需要为False(默认值)</span>
<span class="hljs-comment"># user_obj = User.objects.filter(is_delete=False, pk=pk).first()</span>
<span class="hljs-comment"># user_data = UserSerializer(instance=user_obj, many=False).data</span> user_data = UserSerializer(instance=user_query, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
)</code></pre>

序列化基础:重点内容

模型类:models.py
from django.db import models

# Create your models here.

class User(models.Model):

CHOICE_SEX = (

(0, '男'),

(1, '女')

)

name = models.CharField(max_length=32, verbose_name='姓名')

password = models.CharField(max_length=64, 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)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
序列化类:
from rest_framework import serializers
from .models import User class UserSerializer(serializers.Serializer):

# 序列化和反序列化都可以使用

name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={

'max_length': '姓名太长',

'min_length': '姓名太短'

})

password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={

'max_length': '密码太长',

'min_length': '密码太短'

})

# 只有反序列化使用 - 用 write_only=True 标示只参与反序列化

sex = serializers.IntegerField(write_only=True)

# 只有序列化使用 - 自定义字段 - 用 read_only=True 标示只参与序列化

gender = serializers.SerializerMethodField(read_only=True)

def get_gender(self, obj):

return obj.get_sex_display()

# 序列化与反序列化都不使用 - 1)注释 | 2)required=False, write_only=True

create_time = serializers.DateTimeField(required=False, write_only=True)
<span class="hljs-comment"># 为全局校验钩子新增校验字段</span>
re_password = serializers.CharField(label=<span class="hljs-string">'确认密码'</span>, max_length=<span class="hljs-number">64</span>, min_length=<span class="hljs-number">3</span>, write_only=<span class="hljs-keyword">True</span>, error_messages={
<span class="hljs-string">'max_length'</span>: <span class="hljs-string">'确认密码太长'</span>,
<span class="hljs-string">'min_length'</span>: <span class="hljs-string">'确认密码太短'</span>
}) <span class="hljs-comment"># 反序列化两大方法重写 - 新增create | 更新update</span>
<span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data) <span class="hljs-comment"># 为put接口提供更新Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update</span><span class="hljs-params">(self, instance, validated_data)</span>:</span>
instance.update(**validated_data)
<span class="hljs-comment"># 返回更新后的instance</span>
<span class="hljs-keyword">return</span> instance <span class="hljs-comment"># 局部钩子</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validate_sex</span><span class="hljs-params">(self, value)</span>:</span>
<span class="hljs-keyword">if</span> value <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> (<span class="hljs-number">0</span>, <span class="hljs-number">1</span>):
<span class="hljs-keyword">raise</span> serializers.ValidationError(<span class="hljs-string">'未知性别'</span>)
<span class="hljs-keyword">return</span> value <span class="hljs-comment"># 全局钩子</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validate</span><span class="hljs-params">(self, attrs)</span>:</span>
re_password = attrs.pop(<span class="hljs-string">'re_password'</span>)
password = attrs.get(<span class="hljs-string">'password'</span>)
<span class="hljs-keyword">if</span> re_password != password:
<span class="hljs-keyword">raise</span> serializers.ValidationError(<span class="hljs-string">'二次密码不一致'</span>)
<span class="hljs-keyword">return</span> attrs</code></pre>
视图类:
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer # 对应路由:/users/ | /users/pk/

# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个 | get获取一个

class UsersAPIView(APIView):

# 获取所有资源 | 单个资源

def get(self, request, *args, **kwargs):

# 单个资源的主键

pk = kwargs.get('pk', None)

if not pk:

user_query = User.objects.filter(is_delete=False).all()

else:

user_query = User.objects.filter(is_delete=False, pk=pk)
    user_data = UserSerializer(instance=user_query, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
) <span class="hljs-comment"># 新增一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">post</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
user_deser = UserSerializer(data=request.data) <span class="hljs-comment"># raise_exception值为True,当校验失败,直接返回校验失败的错误信息</span>
<span class="hljs-comment"># result = user_deser.is_valid(raise_exception=True)</span>
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
new_user_obj = user_deser.save()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
}) <span class="hljs-comment"># 更新一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">put</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
pk = kwargs.get(<span class="hljs-string">'pk'</span>)
old_user_query = User.objects.filter(pk=pk, is_delete=<span class="hljs-keyword">False</span>)
<span class="hljs-comment"># 没有数据</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> old_user_query:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'update failed'</span>,
}) user_deser = UserSerializer(instance=old_user_query, data=request.data)
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
new_user_query = user_deser.save()
new_user_obj = new_user_query.first()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
}) <span class="hljs-comment"># 删除一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">delete</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
pk = kwargs.get(<span class="hljs-string">'pk'</span>)
<span class="hljs-keyword">try</span>:
delete_user_obj = User.objects.get(pk=pk, is_delete=<span class="hljs-keyword">False</span>)
<span class="hljs-comment"># 完成删除信息的更新</span>
delete_user_obj.is_delete = <span class="hljs-keyword">True</span>
delete_user_obj.save()
<span class="hljs-keyword">return</span> Response()
<span class="hljs-keyword">except</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'数据删除失败'</span>
})</code></pre>

drf序列化器与反序列化的更多相关文章

  1. DRF框架之Serializer序列化器的反序列化操作

    昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...

  2. drf序列化器的实例

    应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...

  3. DRF序列化器的使用

    序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...

  4. DRF 序列化器-Serializer (2)

    作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...

  5. DRF序列化器

    序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典 ...

  6. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  7. 对drf序列化器的理解

    序列化: 将对象的状态信息转换为可以存储或传输的形式的过程.(百度定义) 对应到drf中,序列化即把模型对象转换为字典形式, 再返回给前端,主要用于输出 反序列化: 把其他格式转化为程序中的格式. 对 ...

  8. 关于定义序列化器时,read_only和write_only有什么作用

    关于序列化和反序列化 ​ 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...

  9. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

随机推荐

  1. SQLite数据库简介和使用

    一.Sqlite简介: SQLite (http://www.sqlite.org/),是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中 ...

  2. WSAEventSelect模型

    WSAEventSelect模型 EventSelect WSAEventSelect function The WSAEventSelect function specifies an event ...

  3. IntelliJ IDEA 删除自定义的 Maven 框架依赖

    IntelliJ IDEA 删除自定义的 Maven 框架依赖 IntelliJ Idea中添加Maven Archetype,但是IntelliJ Idea中并没有提供删除的方法. windows中 ...

  4. redis学习(一)

    Redis学习内容: 1. 概念 2. 下载安装R 3. 命令操作 1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis 1. 概念: redis是一款高性能的NOSQL系列的非关 ...

  5. Word 图片表格自动编号、交叉引用、批量更改图片标题格式、生成图录和表录

    1. 前言 论文往往里往往需要插入很多图片,下放需要标上 图a-b,其中 a 是章节号码,b是该章节中第几张图.比如第一章第二副图就是 图1-2.但是有个问题,每次我们插入了一张图或删掉了一张,前后的 ...

  6. AtCoder-abc147 (题解)

    A - Blackjack (水题) 题目链接 大致思路: 水题 B - Palindrome-philia (水题) 题目链接 大致思路: 由于整个串是回文串,只要判断前一半和后一半有多少个不同即可 ...

  7. cocos creator ScrollView组件scrollToOffset()方法的使用

    前言 之前想用scrollToOffset()在打开界面时,滑动窗口滑动到一个相对应的位置,但是使用scrollToOffset()这个方法的时候,没起作用.然后就用了其他方法来实现相同的效果.现在有 ...

  8. MEF在WCF REST中实际应用2(Global.asax注册)

    IOCContainer文件: public class IOCContainer { /// <summary> /// 容器 /// </summary> public s ...

  9. XML和Json的特点

    Xml特点: 1.有且只有一个根节点: 2.数据传输的载体 3.所有的标签都需要自定义 4.是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: ...

  10. wind安装Jenkins+sonar+jdk

    最近公司在用Jenkins持续集成软件,自己研究的头痛,而且还是和C#项目融合到一起的,网上看到的都是Java的,我自己配了一套和C#的,和你们分享. Jenkins是一个开源软件项目,旨在提供一个开 ...