亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于Django框架的關(guān)系模型序列化和一對(duì)多關(guān)系中的序列化解析

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

1.關(guān)系模型序列化

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

序列化的意思是把字典的形式轉(zhuǎn)化成Json格式。當(dāng)我們展示數(shù)據(jù)的時(shí)候需要使用。反序列化的話,就是Json轉(zhuǎn)成字典形式,存儲(chǔ)數(shù)據(jù)時(shí)候使用。

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

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

1.3 代碼展示

一對(duì)多模型

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班級(jí)名稱')
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='班級(jí)')

序列化類

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):
    # 新增班級(jí)屬性
    classes = ClassesSerializer() # 一定要加括號(hào),創(chuàng)建實(shí)例對(duì)象。否則,只能輸出id
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'

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

在這里插入圖片描述

2. 一對(duì)多關(guān)系的增刪改查

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
###################一對(duì)多關(guān)系表的增刪改查####################
# 完成新增 查詢所有,路由相同,但是請(qǐng)求方式不同
@csrf_exempt # 關(guān)閉csrf中間件(防止利用cookie和token攻擊網(wǎng)站)的使用
def classes(request):
    # 判斷請(qǐng)求方式,完成新增和查詢所有
    if request.method == 'GET':
        # 查詢所有數(shù)據(jù)
        stu_list = Classes.objects.all() 
        # 序列化
        serializer = ClassesSerializer(stu_list, many=True)
        # 將json格式返回客戶端
        return JsonResponse(serializer.data, safe=False)
    elif request.method == 'POST':
        # 新增數(shù)據(jù)
        # 使用JSONParaser調(diào)用parse()進(jìn)行反序列化為字典
        data_dict = JSONParser().parse(request)
        # 將字典傳入到序列化類中
        serializer = ClassesSerializer(data=data_dict)
        # 進(jìn)行驗(yàn)證
        if serializer.is_valid():
            # 保存數(shù)據(jù)到數(shù)據(jù)庫(kù)中
            serializer.save()
            # 返回新保存的數(shù)據(jù)  狀態(tài)碼 201
            return JsonResponse(serializer.data, status = 201)
        return JsonResponse(serializer.errors, status=400)
# 查詢一個(gè) 刪除   修改
@csrf_exempt # 關(guān)閉csrf中間件(防止利用cookie和token攻擊網(wǎng)站)的使用
def classes_detail(request,pk):
    try:
        # 根據(jù)pk獲取Classes
        classes = Classes.objects.get(pk=pk)
    except Classes.DoesNotExist: #無(wú)法獲取到
        return HttpResponse(status=404)
    if request.method == 'GET':
        # 根據(jù)id查詢指定的Student
        # 序列化——展示數(shù)據(jù)
        serializer = ClassesSerializer(classes)
        # 返回json數(shù)據(jù)
        return JsonResponse(serializer.data)
    elif request.method == 'PUT':
        # 根據(jù)id修改Student
        # 反序列化——獲取需要使用的數(shù)據(jù)時(shí)使用
        data_dict = JSONParser().parse(request)
        # 將原來(lái)的對(duì)象 字典數(shù)據(jù)傳入序列化類中
        serializer = ClassesSerializer(classes, data=data_dict)
        # 進(jìn)行驗(yàn)證
        if serializer.is_valid():
            # 更新數(shù)據(jù)到數(shù)據(jù)庫(kù)
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
    elif request.method == 'DELETE':
        # 根據(jù)id刪除classes
        classes.delete()
        return HttpResponse(status=200)

2.2 效果展示

查詢單條數(shù)據(jù)

在這里插入圖片描述

查詢?nèi)繑?shù)據(jù)

在這里插入圖片描述

POST請(qǐng)求插入信息

在這里插入圖片描述

PUT請(qǐng)求修改數(shù)據(jù)

在這里插入圖片描述

DELETE刪除數(shù)據(jù)

在這里插入圖片描述

3.一對(duì)多關(guān)系中在一方想獲取多方數(shù)據(jù)并序列化方法

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

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班級(jí)名稱')
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='班級(jí)')

序列化

from rest_framework import serializers
from rest_app.models import *
# 根據(jù)學(xué)生獲取學(xué)生所在班級(jí)
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班級(jí)屬性
#     classes = ClassesSerializer() # 一定要加括號(hào),創(chuàng)建實(shí)例對(duì)象。否則,只能輸出id
#     class Meta:
#         model = Student
#         fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
# 根據(jù)班級(jí)獲取班級(jí)所有學(xué)生信息
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. 手動(dòng)處理關(guān)系字段

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

序列化

from rest_framework import serializers
from rest_app.models import *
# 根據(jù)學(xué)生獲取學(xué)生所在班級(jí)
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班級(jí)屬性
#     classes = ClassesSerializer() # 一定要加括號(hào),創(chuàng)建實(shí)例對(duì)象。否則,只能輸出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}
# 根據(jù)班級(jí)獲取班級(jí)所有學(xué)生信息
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']

在這里插入圖片描述

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

相關(guān)文章

  • Selenium鼠標(biāo)與鍵盤事件常用操作方法示例

    Selenium鼠標(biāo)與鍵盤事件常用操作方法示例

    這篇文章主要介紹了Selenium鼠標(biāo)與鍵盤事件常用操作方法,結(jié)合實(shí)例形式分析了Selenium鼠標(biāo)事件與鍵盤事件常見方法與相關(guān)使用技巧,需要的朋友可以參考下
    2018-08-08
  • python函數(shù)enumerate,operator和Counter使用技巧實(shí)例小結(jié)

    python函數(shù)enumerate,operator和Counter使用技巧實(shí)例小結(jié)

    這篇文章主要介紹了python函數(shù)enumerate,operator和Counter使用技巧,結(jié)合實(shí)例形式總結(jié)分析了python內(nèi)置函數(shù)enumerate,operator和Counter基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • python中sql解析庫(kù)sqlparse基本操作指南

    python中sql解析庫(kù)sqlparse基本操作指南

    sqlparse是用于Python的非驗(yàn)證SQL解析器,它提供了對(duì)SQL語(yǔ)句的解析,拆分和格式化的支持,這篇文章主要給大家介紹了關(guān)于python中sql解析庫(kù)sqlparse基本操作指南的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 關(guān)于Pytorch的MNIST數(shù)據(jù)集的預(yù)處理詳解

    關(guān)于Pytorch的MNIST數(shù)據(jù)集的預(yù)處理詳解

    今天小編就為大家分享一篇關(guān)于Pytorch的MNIST數(shù)據(jù)集的預(yù)處理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python容器使用的5個(gè)技巧和2個(gè)誤區(qū)總結(jié)

    Python容器使用的5個(gè)技巧和2個(gè)誤區(qū)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Python容器使用的5個(gè)技巧和2個(gè)誤區(qū)的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-09-09
  • python提取word文件中的所有圖片

    python提取word文件中的所有圖片

    辦公中,偶爾會(huì)碰到一種情況,需要提取word文檔中的圖片,決定寫這樣一款工具自動(dòng)提取圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細(xì)教程

    在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細(xì)教程

    使用os.system()這個(gè)方法簡(jiǎn)單直接,但它不返回命令的輸出,只返回命令的退出狀態(tài),如果你只需要知道命令是否成功執(zhí)行,這個(gè)方法就足夠了,這篇文章主要介紹了在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細(xì)教程,需要的朋友可以參考下
    2024-02-02
  • python??UPX?is?not?available問(wèn)題解決方法

    python??UPX?is?not?available問(wèn)題解決方法

    這篇文章主要介紹了python?UPX?is?not?available問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Pytorch之保存讀取模型實(shí)例

    Pytorch之保存讀取模型實(shí)例

    今天小編就為大家分享一篇Pytorch之保存讀取模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • python設(shè)置 matplotlib 正確顯示中文的四種方式

    python設(shè)置 matplotlib 正確顯示中文的四種方式

    這篇文章主要介紹了python設(shè)置 matplotlib 正確顯示中文的四種方式,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-05-05

最新評(píng)論