什么是序列化与反序列化

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

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. DataPipeline |ApacheKafka实战作者胡夕:Apache Kafka监控与调优

    https://baijiahao.baidu.com/s?id=1610644333184173190&wfr=spider&for=pc DataPipeline |ApacheK ...

  2. [ARM-Linux开发]Linux下加载.ko驱动模块的两种方法:insmod与modprobe

    假设要加载的驱动程序模块名为SHT21.ko 加载驱动模块 方法一:  进入SHT21.ko驱动模块文件所在的目录,然后直接  insmod SHT21.ko  即可 方法二:  将SHT21.ko文 ...

  3. 2019年新加坡之行 Day 1

    又到了公司每年一次的年度旅游,继前几年的香港.日本.韩国游后,今年公司选择了新加坡.由于之前曾在新加坡公司The Adventus Consultants工作过2年时间,所以对于这次重返新加坡,我还是 ...

  4. 使用Android SDK卸载厂家程序

    ADB下载: 官网翻墙比较慢,这里推荐使用国内网站:https://www.androiddevtools.cn/ 下载  SDK Tools  和  SDK Platform-Tools: 两者分别 ...

  5. Navicat 创建oracle表空间、新建用户、授权

    1.利用数据库管理员账号:SYSTEM,再配合数据库管理口令,连接Oracle数据库. 登录界面: 2.创建表空间文件 进入如下界面 进入如下界面 弹出如下界面,输入表空间名称 最终结果:  2 .新 ...

  6. Python进阶:并发编程之Asyncio

    什么是Asyncio 多线程有诸多优点且应用广泛,但也存在一定的局限性: 比如,多线程运行过程容易被打断,因此有可能出现 race condition 的情况:再如,线程切换本身存在一定的损耗,线程数 ...

  7. 【VUE】1.搭建一个webpack项目

    1.npm之类的安装跳过 2.安装npm install -g @vue/cli-init 初始化项目目录 vue init webpack vue_cutter_point_blog_admin 并 ...

  8. ubuntu 安装Jenkins

    一.介绍 Jenkins是一款开源自动化服务器,旨在自动化连续集成和交付软件所涉及的重复技术任务. Jenkins是基于Java的,可以从Ubuntu软件包安装,也可以通过下载和运行其Web应用程序A ...

  9. 1、C#多线程基础理论

    系统为应用程序分配所需的内存以及其他资源,内存和资源的物理分离叫做进程.   进程是以线程为单位竞争CPU,那么什么是线程呢? 线程可看成一个可执行的指令单元,他使用进程中的数据,包含若干条指令,进程 ...

  10. 2019 猎豹移动java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.猎豹移动等公司offer,岗位是Java后端开发,最终选择去了猎豹移动. 面试了很多家公司,感觉大部分公司考察的点 ...