關(guān)于Django框架的關(guān)系模型序列化和一對(duì)多關(guān)系中的序列化解析
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。在其中改寫(xiě)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)文章
Django用戶注冊(cè)并自動(dòng)關(guān)聯(lián)到某數(shù)據(jù)表?xiàng)l目的實(shí)現(xiàn)步驟
當(dāng)一個(gè)新用戶注冊(cè)并且你想要自動(dòng)關(guān)聯(lián)到特定的Box條目(假設(shè)其ID為1)時(shí),下面給大家分享完整實(shí)現(xiàn)流程和步驟,對(duì)Django關(guān)聯(lián)數(shù)據(jù)表?xiàng)l目實(shí)現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧2017-04-04

