02|Django REST framework serialization

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 Serializerbased 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


Insert picture description here

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.pyset the following content

MEDIA_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, email,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

[External link image transfer failed. The source site may have an anti-leech link mechanism. It is recommended to save the image and upload it directly (img-G4BXzYG4-1600784207435)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource /p526)]

④ Restart the Django process and test in the browser

[External link image transfer failed. The source site may have an anti-leech link mechanism. It is recommended to save the image and upload it directly (img-QFDmMGok-1600784207444)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource /p527)]

2. ModelSerializer

When the data to be serialized is certain fields in the Model, ModelSerializersthings 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"),
]

④ Restart the Django process and test in the browser

Insert picture description here

Insert picture description here

Guess you like

Origin blog.csdn.net/qq_22648091/article/details/108742564