Article Directory
One, Serialization (serialization)
DRF's Serialization and Django's form programming ideas are almost the same. If you have a good understanding of form, learning DRF is actually very simple.
Sequence of the DRF supports also have separate custom fields Serializer
based Model ofModelSerializer
1.Serializer
serializers
More suitable for serialization of custom fields independent of model.
For example, in the password modification function, it is required to output two password verifications, and a field will be stored in the model. It can be used if it is verified whether the two password entries are consistent serializers
.
① Create a class for serializing data
Classes that create serialized data need to be inherited
rest_framework.serializers.Serializer
from rest_framework import serializers
class UsersSerializer(serializers.Serializer):
username = serializers.CharField(
required=True, max_length=150)
email = serializers.EmailField(
required=False, allow_null=True )
password = serializers.CharField(
required=True, max_length=128)
last_login = serializers.DateTimeField(
required=False, allow_null=True)
image = serializers.ImageField(
default='users/no-image.jpg', max_length=128)
There is a field picture file, you need to
settings.py
set the following contentMEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = "/media/"
② Use serialized classes in the view
Sample model
class UsersProfile(AbstractUser):
nick_name = models.CharField('昵称', max_length=64, default='')
birday = models.DateField('生日', null=True, blank=True)
gender = models.CharField('性别', max_length=6, choices=(('1','男'),('0','女')), default='1')
address = models.CharField('地址', max_length=128, default='')
mobile = models.CharField('手机', max_length=11)
image = models.ImageField('头像', upload_to="users/%Y/%m", default='users/no-image.jpg', max_length=128)
This model comes with Django apparently inherited
AbstractUser
,
so there will be the following fields:
username
,password
,last_login
view
Need to inherit
rest_framework.views.APIView
from rest_framework.response import Response
from rest_framework.views import APIView
# 导入自定义的序列化类
from .serializers import UsersSerializer
# 导入 model
from users.models import UsersProfile
# 编写视图,继承 APIView
class UsersProfileAPIView(APIView):
def get(self, request):
users = UsersProfile.objects.all()
users_serializer = UsersSerializer(users, many=True)
return Response(users_serializer.data)
When the serialized data is a set of query sets, you need to add parameters
many=True
③ Add URL
④ Restart the Django process and test in the browser
2. ModelSerializer
When the data to be serialized is certain fields in the Model, ModelSerializers
things can be made super simple.
Sample model
# 服务器表
class Server(models.Model):
hostname = models.CharField(verbose_name='主机名', max_length=128, unique=True)
manage_ip = models.GenericIPAddressField(verbose_name='管理 IP', null=True, blank=True)
latest_date = models.DateTimeField(verbose_name='更新时间', default=timezone.now, null=True)
create_at = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
# 硬盘表
class Disk(models.Model):
slot = models.CharField(verbose_name='插槽位', max_length=8)
model = models.CharField(verbose_name='磁盘型号', max_length=32)
capacity = models.FloatField(verbose_name='磁盘容量GB')
pd_type = models.CharField(verbose_name='接口类型', max_length=32)
server_obj = models.ForeignKey(
Server, related_name='disk',
verbose_name='所属服务器', on_delete=models.CASCADE)
① Create a serialized class based on Model
Need to inherit
rest_framework.serializers.ModelSerializer
from rest_framework import serializers
from cmdb.models import Server, Disk
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
fields = ['hostname', 'manage_ip', 'latest_date', 'create_at']
class DiskSerializer(serializers.ModelSerializer):
# 这里可以实现在 硬盘信息中含有对应服务器的详细信息
server_obj = ServerSerializer()
class Meta:
model = Disk
fields = ['slot', 'model','capacity',
'pd_type',
'server_obj']
② Use in view
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import ServerSerializer, DiskSerializer
from cmdb.models import Server, Disk
class ServerAPIView(APIView):
def get(self, request):
servers = Server.objects.all()
servers_serializer = ServerSerializer(servers, many=True)
return Response(servers_serializer.data)
class DiskAPIView(APIView):
def get(self, request):
disks = Disk.objects.all()
disks_serializer = DiskSerializer(disks, many=True)
return Response(disks_serializer.data)
③ Configure URL
from django.urls import path
from . import views
app_name = "api"
urlpatterns = [
...
path('servers/',
views.ServerAPIView.as_view(),
name="servers"),
path('disks/',
views.DiskAPIView.as_view(),
name="disks"),
]