2、django后端:课程表、课程详细表
2024-10-06 18:03:01
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)
最新文章
- TCP/IP之Nagle算法与40ms延迟
- ILSpy搜索功能加强版
- 【整理】--VC 编译整理
- zookeeper系列之九—zookeeper数据模型
- SSH基础(2)
- 内部类之.this&;&;.new
- php 分析
- css3hover效果
- Winform 控件的入门级使用(一)
- iOS学习——键盘弹出遮挡输入框问题解决方案
- 饮冰三年-人工智能-Python-29瀑布流
- 基于Dockerfile镜像制作的基本操作
- 转帖: 一份超全超详细的 ADB 用法大全
- C++ 输入输出八进制、十进制、十六进制
- Nginx 限制访问速率
- WebView与 JS 交互方式
- ERP项目实施记录05
- MFC message routine
- Tomcat------如何查看80端口是否被占用
- 小程序嵌套h5