最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于Django框架的關系模型序列化和一對多關系中的序列化解析

 更新時間:2023年05月18日 08:29:25   作者:想成為數據分析師的開發(fā)工程師  
序列化的意思是把字典的形式轉化成Json格式。當我們展示數據的時候需要使用,反序列化的話,就是Json轉成字典形式,存儲數據時候使用,需要的朋友可以參考下

1.關系模型序列化

1.1 什么是序列化?什么是反序列化?

序列化的意思是把字典的形式轉化成Json格式。當我們展示數據的時候需要使用。反序列化的話,就是Json轉成字典形式,存儲數據時候使用。

1.2 如何實現(xiàn)序列化與反序列化?

實現(xiàn)的方法就是,通過創(chuàng)建一個序列化類,繼承serializers.ModelSerializer。在其中改寫Meta類。具體效果看代碼

1.3 代碼展示

一對多模型

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班級名稱')
class Student(models.Model):
    SEX_CHOICES = ((1,'男'),(2,'女'))
    name = models.CharField(max_length=20,verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年齡')
    sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性別')
    # 多方建立外鍵
    classes = models.ForeignKey(Classes, on_delete=models.SET_NULL, null=True, verbose_name='班級')

序列化類

from rest_framework import serializers
from rest_app.models import *
class ClassesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = ['id', 'name']
class StudentSerializer(serializers.ModelSerializer):
    # 新增班級屬性
    classes = ClassesSerializer() # 一定要加括號,創(chuàng)建實例對象。否則,只能輸出id
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'

創(chuàng)建好就是遷移模型啦,Django遷移模型方法可以參考本專欄之前的文章

在這里插入圖片描述

2. 一對多關系的增刪改查

2.1 代碼展示

from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_app.models import *
from rest_app.app_serializer import StudentSerializer,ClassesSerializer
from django.http import JsonResponse,HttpResponse
from rest_framework.parsers import JSONParser
###################一對多關系表的增刪改查####################
# 完成新增 查詢所有,路由相同,但是請求方式不同
@csrf_exempt # 關閉csrf中間件(防止利用cookie和token攻擊網站)的使用
def classes(request):
    # 判斷請求方式,完成新增和查詢所有
    if request.method == 'GET':
        # 查詢所有數據
        stu_list = Classes.objects.all() 
        # 序列化
        serializer = ClassesSerializer(stu_list, many=True)
        # 將json格式返回客戶端
        return JsonResponse(serializer.data, safe=False)
    elif request.method == 'POST':
        # 新增數據
        # 使用JSONParaser調用parse()進行反序列化為字典
        data_dict = JSONParser().parse(request)
        # 將字典傳入到序列化類中
        serializer = ClassesSerializer(data=data_dict)
        # 進行驗證
        if serializer.is_valid():
            # 保存數據到數據庫中
            serializer.save()
            # 返回新保存的數據  狀態(tài)碼 201
            return JsonResponse(serializer.data, status = 201)
        return JsonResponse(serializer.errors, status=400)
# 查詢一個 刪除   修改
@csrf_exempt # 關閉csrf中間件(防止利用cookie和token攻擊網站)的使用
def classes_detail(request,pk):
    try:
        # 根據pk獲取Classes
        classes = Classes.objects.get(pk=pk)
    except Classes.DoesNotExist: #無法獲取到
        return HttpResponse(status=404)
    if request.method == 'GET':
        # 根據id查詢指定的Student
        # 序列化——展示數據
        serializer = ClassesSerializer(classes)
        # 返回json數據
        return JsonResponse(serializer.data)
    elif request.method == 'PUT':
        # 根據id修改Student
        # 反序列化——獲取需要使用的數據時使用
        data_dict = JSONParser().parse(request)
        # 將原來的對象 字典數據傳入序列化類中
        serializer = ClassesSerializer(classes, data=data_dict)
        # 進行驗證
        if serializer.is_valid():
            # 更新數據到數據庫
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
    elif request.method == 'DELETE':
        # 根據id刪除classes
        classes.delete()
        return HttpResponse(status=200)

2.2 效果展示

查詢單條數據

在這里插入圖片描述

查詢全部數據

在這里插入圖片描述

POST請求插入信息

在這里插入圖片描述

PUT請求修改數據

在這里插入圖片描述

DELETE刪除數據

在這里插入圖片描述

3.一對多關系中在一方想獲取多方數據并序列化方法

首先,在模型中的多方應該在外鍵中加入屬性related_name,在模型的一方中,使用屬性名記錄多方的序列化后字段。在fields中添加入屬性名。 模型

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班級名稱')
class Student(models.Model):
    SEX_CHOICES = ((1,'男'),(2,'女'))
    name = models.CharField(max_length=20,verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年齡')
    sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性別')
    # 多方建立外鍵
    classes = models.ForeignKey(Classes, related_name='students' ,on_delete=models.SET_NULL, null=True, verbose_name='班級')

序列化

from rest_framework import serializers
from rest_app.models import *
# 根據學生獲取學生所在班級
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班級屬性
#     classes = ClassesSerializer() # 一定要加括號,創(chuàng)建實例對象。否則,只能輸出id
#     class Meta:
#         model = Student
#         fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
# 根據班級獲取班級所有學生信息
class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex'] #或者 ='__all__'
class ClassesSerializer(serializers.ModelSerializer):
    # students 屬性要和student類中外鍵classes屬性 related_name='students'
    # 多條記錄 指定many = True, read_only=True
    students = StudentSerializer(many=True, read_only=True) 
    class Meta:
        model = Classes
        fields = ['id', 'name','students']        

效果展示

在這里插入圖片描述

4. 手動處理關系字段

在上述中,由于類的引用關系的原因,左右只能自動序列化一個關系字段,如果業(yè)務需求,需要2個關系字段都序列化,那么就需要使用到serializers.RelatedField類,手動處理字段關系。

序列化

from rest_framework import serializers
from rest_app.models import *
# 根據學生獲取學生所在班級
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班級屬性
#     classes = ClassesSerializer() # 一定要加括號,創(chuàng)建實例對象。否則,只能輸出id
#     class Meta:
#         model = Student
#         fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
class ClassesRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        return {'id':value.id, 'name':value.name}
# 根據班級獲取班級所有學生信息
class StudentSerializer(serializers.ModelSerializer):
    # classes 屬性名和Student類中外鍵屬性名相同
    classes = ClassesRelatedField(read_only=True)
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
class ClassesSerializer(serializers.ModelSerializer):
    # students 屬性要和student類中外鍵classes屬性 related_name='students'
    # 多條記錄 指定many = True, read_only=True
    students = StudentSerializer(many=True, read_only=True) 
    class Meta:
        model = Classes
        fields = ['id', 'name','students']

在這里插入圖片描述

到此這篇關于關于Django框架的關系模型序列化和一對多關系中的序列化解析的文章就介紹到這了,更多相關Django框架關系模型序列化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python的OptionParser模塊示例教程

    Python的OptionParser模塊示例教程

    這篇文章主要介紹了Python的OptionParser模塊教程,本文通過示例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Python如何生成xml文件

    Python如何生成xml文件

    在本篇文章里小編給大家分享的是一篇關于Python生成xml文件方法以及實例代碼,需要的朋友們可以學習下。
    2020-06-06
  • python 計算文件的md5值實例

    python 計算文件的md5值實例

    下面小編就為大家?guī)硪黄猵ython 計算文件的md5值實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 解析Python中的生成器及其與迭代器的差異

    解析Python中的生成器及其與迭代器的差異

    生成器是一種特殊的迭代器,而反過來說則就不對了,迭代器在Python中是一個更抽象的概念,以下我們就來詳細解析Python中的生成器及其與迭代器的差異
    2016-06-06
  • 2019 Python最新面試題及答案16道題

    2019 Python最新面試題及答案16道題

    這篇文章主要介紹了2019 Python最新面試題及答案16道題 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 15個短代碼示例理解python豐富的編程思維

    15個短代碼示例理解python豐富的編程思維

    這篇文章主要為大家介紹了python豐富的編程思維,文中通過python的幾行短代碼示例來給大家進行詳細的講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Django用戶注冊并自動關聯(lián)到某數據表條目的實現(xiàn)步驟

    Django用戶注冊并自動關聯(lián)到某數據表條目的實現(xiàn)步驟

    當一個新用戶注冊并且你想要自動關聯(lián)到特定的Box條目(假設其ID為1)時,下面給大家分享完整實現(xiàn)流程和步驟,對Django關聯(lián)數據表條目實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2017-04-04
  • Python學習之迭代器的使用教程詳解

    Python學習之迭代器的使用教程詳解

    迭代器是一種對象,該對象包含值的可計數數字。從技術上講,在?Python?中,迭代器是實現(xiàn)迭代器協(xié)議的對象,它包含方法?iter()?和?next()。本文就來聊聊迭代器的具體使用吧
    2023-03-03
  • linux下python抓屏實現(xiàn)方法

    linux下python抓屏實現(xiàn)方法

    這篇文章主要介紹了linux下python抓屏實現(xiàn)方法,涉及Python操作屏幕截取的相關技巧,需要的朋友可以參考下
    2015-05-05
  • Python配置文件處理的方法教程

    Python配置文件處理的方法教程

    這篇文章主要給大家介紹了關于Python配置文件處理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08

最新評論

乐平市| 北海市| 喀喇沁旗| 马公市| 泰州市| 德清县| 永福县| 香河县| 福安市| 禹州市| 南昌市| 邮箱| 兴仁县| 西峡县| 寿宁县| 疏勒县| 江门市| 富裕县| 山阴县| 北流市| 镇沅| 河源市| 斗六市| 滨州市| 子长县| 城市| 三原县| 庆元县| 洛阳市| 花莲县| 开鲁县| 洮南市| 光泽县| 闽清县| 余江县| 高安市| 合川市| 陵川县| 五家渠市| 尚义县| 民勤县|