關于Django框架的關系模型序列化和一對多關系中的序列化解析
1.關系模型序列化
1.1 什么是序列化?什么是反序列化?
序列化的意思是把字典的形式轉化成Json格式。當我們展示數據的時候需要使用。反序列化的話,就是Json轉成字典形式,存儲數據時候使用。
1.2 如何實現序列化與反序列化?
實現的方法就是,通過創(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函數enumerate,operator和Counter使用技巧實例小結
這篇文章主要介紹了python函數enumerate,operator和Counter使用技巧,結合實例形式總結分析了python內置函數enumerate,operator和Counter基本功能、原理、用法及操作注意事項,需要的朋友可以參考下2020-02-02在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細教程
使用os.system()這個方法簡單直接,但它不返回命令的輸出,只返回命令的退出狀態(tài),如果你只需要知道命令是否成功執(zhí)行,這個方法就足夠了,這篇文章主要介紹了在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細教程,需要的朋友可以參考下2024-02-02python??UPX?is?not?available問題解決方法
這篇文章主要介紹了python?UPX?is?not?available問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04python設置 matplotlib 正確顯示中文的四種方式
這篇文章主要介紹了python設置 matplotlib 正確顯示中文的四種方式,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-05-05