drf序列化器与反序列化
什么是序列化与反序列化
"""
序列化:对象转换为字符串用于传输
反序列化:字符串转换为对象用于使用
"""
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序列化器与反序列化的更多相关文章
- DRF框架之Serializer序列化器的反序列化操作
昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...
- DRF序列化器的使用
序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...
- DRF 序列化器-Serializer (2)
作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...
- DRF序列化器
序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典 ...
- drf序列化器serializers.SerializerMethodField()的用法
问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...
- 对drf序列化器的理解
序列化: 将对象的状态信息转换为可以存储或传输的形式的过程.(百度定义) 对应到drf中,序列化即把模型对象转换为字典形式, 再返回给前端,主要用于输出 反序列化: 把其他格式转化为程序中的格式. 对 ...
- 关于定义序列化器时,read_only和write_only有什么作用
关于序列化和反序列化 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
随机推荐
- windows下的计算时间间隔 -- GetTickCount()
用法: #include "windows.h" DWORD lastTime =0;DWORD currentTime = 0;DWORD spendTime = 0; last ...
- 2019 西安邀请赛 D
//n件物品,m种关系,(有关系的2个不能在同一组) //把所有物品分为2组,希望最后2组的差值尽可能小,输出较大者 /* 二分图涂色+可行性(01)背包 dp[i] =1表示 最后差值为i可行 建图 ...
- JVM知识点总览-高级Java工程师面试必备
jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 当然这些知识点在之前的文章中都有详细的介绍,这里只做主干的梳理 这里画了一个思维导图, ...
- Fineui 实现点击左边树状主菜单链接 打开新窗口或打开多个同一个tab
原文:http://fineui.com/bbs/forum.php?mod=viewthread&tid=7019&page=1#pid31469 代码如下: < ...
- golang(一)
开篇先来个Go语言的吉祥物-金花鼠Gordon. golang是谷歌2009年发布的开源编程语言,截止目前go的release版本已经到了1.10.go语言的开发人员都是计算机界大神一般的存在: Th ...
- webpack4基础入门操作(二)(讲解下webpack的配置内容)
前序:我之所以开始写这个系列,是因为我最近出去看了下外面的情况,发现技术更新的脚步太快了.我的技术栈已经完全落伍了. 所以准备今年学习写新的东西,而React.webPack4就是我的第一步.前面我看 ...
- 阿里巴巴 Java 开发手册(四): OOP 规约
. [强制]避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可. 2. [强制]所有的覆写方法,必须加@Override 注解. 说明:getObje ...
- K8S 中的容器编排和应用编排
众所周知,Kubernetes 是一个容器编排平台,它有非常丰富的原始的 API 来支持容器编排,但是对于用户来说更加关心的是一个应用的编排,包含多容器和服务的组合,管理它们之间的依赖关系,以及如何管 ...
- 《明日方舟》Python版公开招募工具
工具介绍 根据输入的标签,快速找出能够招募4星,5星干员的标签组合,比如刷出了 重装 | 男 | 支援 |术师 | 先锋 五个标签,输入效果如下: 注意:不支持高级干员和资深高级干员标签 使用环境 安 ...
- ImportError: cannot import name Namespace
运行socketServer报错. 解决: pip uninstall python-socketio pip install python-socketio