2、django后端:课程表、课程详细表

1、课程表录入数据

 有些人卖接口,接口就是 数据

1、课程表

2张表+3张表

 

 分布式数据库分表

数据库优化

垂直分表

1000w条数据,999w条数据不常看,经常查的1w条数据放在另一个表

水平分表

常用的列

2、model表

from django.db import models


# Create your models here.

class Course(models.Model):
    """
    课程表
    """
    title = models.CharField(verbose_name="课程名称", max_length=32)
    course_img = models.CharField(verbose_name="课程图片", max_length=64)
    level_choices = (
        (1, "初级"),
        (2, "中级"),
        (3, "高级")
    )
    level = models.IntegerField(verbose_name="课程难易程度", choices=level_choices, default=1)

    # admin中显示字段
    def __str__(self):
        return self.title


class CourseDetail(models.Model):
    """
    课程详细
    """
    course = models.OneToOneField(to='Course', on_delete=models.CASCADE)
    slogon = models.CharField(verbose_name="口号", max_length=255)
    why = models.CharField(verbose_name="为什么要学习?", max_length=255)
    recomme_courses = models.ManyToManyField(verbose_name="推荐课程", to='Course', related_name='rc')

    def __str__(self):
        return '课程详细' + self.course.title


class Chapter(models.Model):
    """
    章节
    """
    num = models.IntegerField(verbose_name='章节')
    name = models.CharField(verbose_name='章节名称', max_length=32)
    course = models.ForeignKey(verbose_name="所属课程", to='Course', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

 生成表结构报错

相同字段冲突

 

 

2个关联字段

__关联字段  如何查找

反向关联字段

 

3、admin中显示

djano官网  https://docs.djangoproject.com/en/2.2/ref/contrib/admin/

from django.contrib import admin

from .models import Course, CourseDetail, Chapter
# Register your models here.

admin.site.register(Course)
admin.site.register(CourseDetail)
admin.site.register(Chapter)

 

创建超级用户

 

 

4、添加数据

2、课程列表接口

1、queryset与object序列化

queryset 里面是个对象

queryset是django的

 json可以序列化的

2、Course表序列化,view

 序列化

 ret返回的数据

 views

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from api.models import Course


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course      # model表
        fields = '__all__'  # 所有字段


class CourseView(APIView):
    def get(self, request, *args, **kwargs):

        ret = {'code': 1000, 'data': None}

        try:
            queryset = Course.objects.all()
            ser = CourseSerializer(instance=queryset, many=True)
            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'

        return Response(ret)

 效果

 

 

3、choices如何序列化:level

 

 3、点击查看课程接口

1、方式1:view接受pk

 

from django.urls import path, include,re_path
from api.view import course

urlpatterns = [

    # 方式1
    path('course', course.CourseView.as_view()),
    re_path('course/(?P<pk>\d+)/$', course.CourseView.as_view())  # 正则 re_path
]

1.1 queryset与obj序列化

一个对象和多个对象

 queryset 与 obj

many=False与many=Ture

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from api.models import Course


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course      # model表
        fields = '__all__'  # 所有字段


class CourseView(APIView):
    def get(self, request, *args, **kwargs):

        ret = {'code': 1000, 'data': None}

        try:
            pk = kwargs.get('pk')
            if pk:
                obj = Course.objects.filter(id=pk).first()
                print(obj)  # python全栈开发
                print(type(obj))    # <class 'api.models.Course'>

                ser = CourseSerializer(instance=obj, many=False)   # 序列化对象
            else:
                queryset = Course.objects.all()

                print(queryset)  # <QuerySet [<Course: python全栈开发>, <Course: 金融量化分析>, <Course: 智能玩具>]>
                print(type(queryset))  # <class 'django.db.models.query.QuerySet'>

                ser = CourseSerializer(instance=queryset, many=True)    # 序列化queryset

            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'

        return Response(ret)

2、方式2:重写 as_view

2.1 view的流程

2.2 重写as_view()源码

 

2.3 代码:url与view

 支持这种写法

from django.urls import path, include,re_path
from api.view import course

urlpatterns = [

    #方式2
    path('course', course.CourseView.as_view({'get': 'list'})),
    re_path('course/(?P<pk>\d+)/$', course.CourseView.as_view({'get': 'retreive'}))  # 正则 re_path
]

 重写as_view方法

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from api.models import Course


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course      # model表
        fields = '__all__'  # 所有字段


# 方式2
from rest_framework.viewsets import ModelViewSet

from rest_framework.viewsets import GenericViewSet,ViewSetMixin

class CourseView(ViewSetMixin, APIView):
    def list(self,request,*args,**kwargs):
        """课程列表接口"""
        ret = {'code': 1000, 'data': None}

        try:
            queryset = Course.objects.all()
            ser = CourseSerializer(instance=queryset, many=True)  # 序列化queryset
            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'
        return Response(ret)

    def retreive(self,request,*args,**kwargs):
        """课程详细接口"""
        ret = {'code': 1000, 'data': None}

        try:
            pk = kwargs.get('pk')
            obj = Course.objects.filter(id=pk).first()
            ser = CourseSerializer(instance=obj, many=False)  # 序列化对象
            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'
        return Response(ret)

 

4、课程Detail接口

 

1、所有字段

 

 

2、depth:自动关联深度(不推荐)

depth 自动关联 0 1 2 3  (不推荐用)

官方建议 0~10 ,

 

3、自定义字段source:一对一,choices

 

关联字段 source

指定字段,用sorce

source跟数据库的某个字段绑定

 

 

level显示中文:get_level_display

自动帮我加 ()

 

  

4、自定义method:多对多,一对多

(1)多对多

如何 取出推荐课程?多对多

 用all?

 

manytomany

自定义 2类

序列化,想要的字段

 

(2)反向取字段:一对多

只能获取一个课程数据

 chapter_set.all()

 

 

 5、代码与总结

1、总结与作业

 

 

 

 

 

 

2、as_view分析

# 方式2
from rest_framework.viewsets import ModelViewSet

'''
class View:
    def as_view(cls):
        pass

class APIView(View):

---------------------
class GenericAPIView(views.APIView):

class ViewSetMixin(object):
    # 重写as_view方法
    def as_view(cls, actions=None, **initkwargs):
        pass
---------------------

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
class ModelViewSet(GenericViewSet)

ModelViewSet
'''

 

3、序列化自定义与view

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from api.models import Course,CourseDetail


class CourseSerializer(serializers.ModelSerializer):
    # choices
    level = serializers.CharField(source='get_level_display')

    class Meta:
        model = Course      # model表
        # fields = '__all__'  # 所有字段
        fields = ['id','title','course_img','level']


class CourseDetailSerializer(serializers.ModelSerializer):

    # one2one/外键/choices多选的
    title = serializers.CharField(source='course.title')
    img = serializers.CharField(source='course.course_img')
    level = serializers.CharField(source='course.get_level_display')  # level显示中文

    # many2many/one2many
    recommends = serializers.SerializerMethodField()
    # recommends = serializers.CharField(source='recomme_courses.all')  # <QuerySet [<Course: python全栈开发>]> queryset需要序列化
    chapter = serializers.SerializerMethodField()


    class Meta:
        model = CourseDetail
        fields = ['title','img','level','recommends','chapter','course', 'slogon', 'why']
        # fields = '__all__'
        # 不推荐用
        # depth = 2   # 默认0  官方建议0~10

    def get_recommends(self,obj):
        """获取所有推荐的课程"""
        queryset = obj.recomme_courses.all()
        # return []
        return [{'id':row.id, 'title':row.title} for row in queryset]

    def get_chapter(self,obj):
        queryset = obj.course.chapter_set.all()
        return [{'id':row.id, 'name':row.name} for row in queryset]


from rest_framework.viewsets import GenericViewSet,ViewSetMixin

class CourseView(ViewSetMixin, APIView):
    def list(self,request,*args,**kwargs):
        """课程列表接口"""
        ret = {'code': 1000, 'data': None}

        try:
            queryset = Course.objects.all()
            ser = CourseSerializer(instance=queryset, many=True)  # 序列化queryset
            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'
        return Response(ret)

    def retreive(self,request,*args,**kwargs):
        """课程详细接口"""
        ret = {'code': 1000, 'data': None}

        try:
            pk = kwargs.get('pk')  # 课程id=2
            obj = CourseDetail.objects.filter(id=pk).first()   # 课程详细对象
            ser = CourseDetailSerializer(instance=obj, many=False)  # 序列化对象
            ret['data'] = ser.data

        except Exception as e:
            ret['code'] = 1001
            ret['error'] = '获取课程失败'
        return Response(ret)

 

posted @ 2019-09-29 16:39  venicid  阅读(818)  评论(0编辑  收藏  举报