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)

2、django后端:课程表、课程详细表的更多相关文章

  1. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  2. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  3. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  4. Vue向后端请求课程展示

    1.Vue结构 App.vue <template> <div id="app"> <router-link to="/index" ...

  5. Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用

    一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...

  6. 05.Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  7. python django基础五 ORM多表操作

    首先在创建表的时候看下分析一下 1.作者表和作者详细地址表  一对一关系 理论上谁都能当主表 把Author设置成主表 au=models.OneToOneField(to='AuthorDetail ...

  8. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  9. Django的orm练习---多表查询

    Django的orm练习---多表查询 表关系如下 表结构 : from django.db import models # Create your models here. # 多对多-----&g ...

随机推荐

  1. 使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署

    kubeadm部署k8s 使用kubeadm进行k8s的部署主要分为以下几个步骤: 环境预装: 主要安装docker.kubeadm等相关工具. 集群部署: 集群部署分为single master(单 ...

  2. MySQL数据库CPU飙升紧急处理方法

    MySQL数据库CPU飙升紧急处理方法 运行平稳的数据库,如果遇到CPU狂飙,到80%左右,那一定是开发写的烂SQL导致的,DBA首先要保证的是,数据库别跑挂了,所以我们要把那些运行慢的SQL杀死并记 ...

  3. oracle中表记录被另一个用户锁住

    应用场景 在查询oracle表时,提示表记录被另一个用户锁住了 有可能是在使用了pl/sql工具后修改某个表记录时,加锁,或者发生故障异常退出,下次登录进去修改不了 查询锁 --查看数据库的锁的来源. ...

  4. Pycharm 误删文件夹

    在Linux下操作时误删除了Pycharm项目中的文件夹,打开垃圾桶,居然找不到,立马上网查Linux下怎么恢复文件, 冷静一下,不是还有个Ctrl + Z吗,对着Pycharm 文件浏览器 按一下, ...

  5. MySQL中的触发器应用

    直接上代码: /*数据库 - udi_ems_test*********************************************************************内容:在 ...

  6. Spring Boot(一) 初步理解Spring Boot

    一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...

  7. Java门面模式(思维导图)

    图1 门面模式[点击查看图片] 1,实体对象类 package com.cnblogs.mufasa.demo1; //3个子系统,解决问题的实体 public class StoreA { //示意 ...

  8. gdb-example-ncurses

    gdb-example-ncurses http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html 1. The Prob ...

  9. POJ1845Sumdiv题解--约数之和

    题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...

  10. 题解 P3369 【【模板】普通平衡树(Treap/SBT)】

    STL真是个好东西. 最近在看pb_ds库及vector和set的用法,就想用这三种操作来实现一下普通平衡树,结果pb_ds中的rbtree不支持重复值,而本蒟蒻也看不懂不懂各大佬用pb_ds的实现, ...