对特殊字段进行序列化
1 source='get_course_type_display'
choice字段
2 source指定
一对一
一对多
参考
3定义一个方法进行for循环取出
一对多(反向)
多对多
1 2 3 4 5 6 | authors = serializers.SerializerMethodField() def get_authors( self ,obj): temp = [] for author in obj.authors. all (): temp.append(author.name) return temp |
from rest_framework import serializers from app01.models import * class CourseSerializers(serializers.ModelSerializer): choice字段进行序列化后显示: course_type =serializers.CharField(source='get_course_type_display') sub_category=serializers.CharField(source='sub_category.name') level=serializers.CharField(source='get_level_display') status=serializers.CharField(source='get_status_display') class Meta: model=Course fields=['id','name','course_img','course_type','sub_category','level','status', 'brief','pub_date','period','order','attachment_path', # ,,,,,,'degree_course' 'template_id' ] class CourseDetailSerializers(serializers.ModelSerializer): course=serializers.CharField(source='course.name') # 教师 teachers=serializers.SerializerMethodField() # 评论课程 recommend_courses=serializers.SerializerMethodField() # 显示常见问题 question=serializers.SerializerMethodField() brief=serializers.CharField(source='course.brief') # coursesubcactegory = serializers.SerializerMethodField() class Meta: model=CourseDetail fields=['id','course','hours','course_slogan','video_brief_link','brief', 'why_study','what_to_study_brief','career_improvement','prerequisite', 'recommend_courses','teachers','question', ] # 评论课程 def get_recommend_courses(self,obj): query=obj.recommend_courses.all() return [{'name':row.name} for row in query] # 老师信息 def get_teachers(self,obj): query=obj.teachers.all() return [{'name':row.name,'brief':row.brief,'signature':row.signature} for row in query] # 常见问题 def get_question(self,obj): query=obj.course.asked_question.all() return [{'question':row.question,'answer':row.answer} for row in query] #取子类(学位课或专题课) def get_coursesubcactegory(self,obj): query=obj.course.sub_category.coursecategory_set.all() return [{'name':row.name} for row in query]
#实现访问全部数据------------------
#与单条数据book表增删改查---------
/books/ -----get books ----- 返回当前所有数据
/books/ -----post books ----- 返回提交数据
/books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
/books/(\d+)-----put bookdetail ----- 返回更新数据
/books/(\d+)-----delete bookdetail ----- 返回空
#urls.py:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Books/$', views.Books.as_view(),name='book'),
url(r'^Books_detail/(\d+)/$', views.Book_detail.as_view(),name='Books_detail'),
url(r'^Author/$', views.AuthorView.as_view(),name='Author'),
url(r'^AuthorDetail/(\d+)/$', views.perBookView.as_view(),name='AuthorDetail'),
]
#views.py:
from django.shortcuts import render,HttpResponse,redirect
from app01.serilizer import *
from django.views import View
from app01.models import *
from rest_framework.response import Response
from rest_framework import serializers
# Create your views here.
from rest_framework.views import APIView
from rest_framework import mixins
from rest_framework import generics
from app01.serilizer import *
class Books(APIView):
def get(self,request):
book_list=Book.objects.all()
bs=BookSerializers(book_list,many=True)
return Response(bs.data)
def post(self,request):
bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors)
class Book_detail(APIView):
def get(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj)
return Response(bs.data)
def put(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors)
def delete(self,request,id):
Book.objects.filter(pk=id).delete()
return Response()
class AuthorView(APIView):
def get(self,request):
author_list=Author.objects.all()
bs=Authorserializers(author_list,many=True)
return Response(bs.data)
def post(self,request):
ps=Authorserializers(data=request.data)
if ps.is_valid():
print(ps.validated_data)
ps.save() # create方法
return Response(ps.data)
else:
return Response(ps.errors)
class perBookView(APIView):
#查看一条
def get(self,request,id):
authors_obj=Author.objects.filter(pk=id).first()
aa=Authorserializers(authors_obj)
return Response(aa.data)
#更新一条
def put(self,request,id):
obj=Author.objects.filter(pk=id).first()
sobj=Authorserializers(obj,data=request.data)
if sobj.is_valid():
sobj.save()
return Response(sobj.data)
else:
return Response(sobj.errors)
#删除一条
def delete(self,request,id):
Author.objects.filter(pk=id).delete()
return Response()
#serilizer(用于序列化).py:
from rest_framework import serializers
from app01.models import *
class Authorserializers(serializers.ModelSerializer):
class Meta:
model=Author
fields="__all__"
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__'
#models.py:
from django.db import models
from django.db import models
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField(null=True)
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title
class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name
class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通