• django restframework -模型序列化高级用法终极篇


    from django.db import models
    
    
    # 作者表
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name
    
    
    # 出版社
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
        email = models.EmailField()
    
        def __str__(self):
            return self.name
    
    
    # 图书列表
    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=15, decimal_places=2)
        # 外键字段
        publish = models.ForeignKey(to="Publish", related_name="book", related_query_name="book_query",
                                    on_delete=models.CASCADE)
        # 多对多字段
        authors = models.ManyToManyField(to="Author")
    复制代码

    2.urls.py

    复制代码
    from django.urls import re_path
    from xfzapp import views
    
    urlpatterns = [
        re_path(r'books/$', views.BookView.as_view({
            'get': 'list',
            'post': 'create'
        })),
        re_path(r'books/(?P<pk>d+)/$', views.BookView.as_view({
            'get': 'retrieve',
            'put': 'update',
            'delete': 'destroy'
        }))
    ]
    复制代码

    3.views.py

    复制代码
    from rest_framework import generics
    from rest_framework.viewsets import ModelViewSet
    from .models import Book
    from .xfz_serializers import BookSerializer
    
    
    class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
    
    class BookView(ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    复制代码

    4.序列化类

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # 导入模块
    from rest_framework import serializers
    from .models import Book
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
    
            fields = ('title',
                      'price',
                      'publish',
                      'authors',
                      '_author_list',
                      '_publish_name',
                      '_publish_city'
                      )
            extra_kwargs = {
                # 以下字段和fields里面的是同一个,加上只写,是不想让客户看见,因为它是一个数字
                'publish': {'write_only': True},
                'authors': {'write_only': True}
            }
        # 带有前缀"_"说明不是表中原有字段
        _publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
        _publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
    
        _author_list = serializers.SerializerMethodField()
        # "get_"是固定格式,"get_"后面部分与author_list保持一致,不能随便写
        def get__author_list(self, book_obj):
            # 拿到queryset开始循环 [{}, {}, {}, {}]
            authors = list()
            for author in book_obj.authors.all():
                authors.append(author.name)
            return authors


  • 相关阅读:
    单进程架构数据库谨防隐形杀手
    21.2 超时与重传的简单例子
    19日下午三点直播:DevOps体系中数据库端的四大问题及解决之道
    SQL无所不能:DBA宝妈宝爸系列分享
    用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
    从块结构谈表的存储参数与性能之间的关系
    MYSQL SHELL 到底是个什么局 剑指 “大芒果”
    大数据构架师经典学习宝典
    POJ 3171 区间最小花费覆盖 (DP+线段树
    POJ 3171 区间最小花费覆盖 (DP+线段树
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/13830297.html
Copyright © 2020-2023  润新知