对特殊字段进行序列化

source='get_course_type_display'

一对一

一对多

choice字段

1定义一个方法进行for循环取出

  一对多(反向)

  多对多

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








猜你喜欢

转载自www.cnblogs.com/wanghuaqiang/p/9209508.html