Django中实现单表和多表接口
基础接口
序列化:course/serializers.py
from rest_framework import serializers
from .models import CourseCategory, Course, Teacher
class CourseCategorySerializer(serializers.ModelSerializer):
class Meta:
model = CourseCategory
fields = ["id","name"]
class TeacherSerializer(serializers.ModelSerializer):
"""课程列表的老师信息"""
class Meta:
model = Teacher
fields = ["id", "name", "role", "title", "signature", "brief", "image"]
class CourseSerializer(serializers.ModelSerializer):
"""课程列表的课程基本信息"""
# 序列化器嵌套[被嵌套的序列化器必须声明对应的字段为模型原有的外键字段,同时这个被嵌套的序列化器必须先声明才能进行调用!]
# 如果嵌套的序列化器数据有多条,则需要在调用序列化器时需要声明 many=True
teacher = TeacherSerializer()
class Meta:
model = Course
fields = ["id", "name", "course_img", "students", "sections", "pub_sections", "price", "teacher", 'section_list]
视图:course/views.py
from rest_framework.generics import ListAPIView
from .models import CourseCategory, Course
from .serializers import CourseCategorySerializer, CourseSerializer
class CourseCategoryAPIView(ListAPIView):
"""课程分类列表接口"""
queryset = CourseCategory.objects.filter(is_delete=False,is_show=True).order_by("orders")
serializer_class = CourseCategorySerializer
class CourseAPIView(ListAPIView):
"""课程列表接口"""
queryset = Course.objects.filter(is_delete=False, is_show=True).order_by("orders")
serializer_class = CourseSerializer
路由:course/urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
path("", views.CourseAPIView.as_view()),
path("category/", views.CourseCategoryAPIView.as_view()),
]
接口
http://127.0.0.1:8000/course/
http://127.0.0.1:8000/course/category/
连表接口
模型演变:course/models.py
class Course(BaseModel):
"""课程"""
course_type = (
(0, '付费'),
(1, 'VIP专享'),
(2, '学位课程')
)
level_choices = (
(0, '初级'),
(1, '中级'),
(2, '高级'),
)
status_choices = (
(0, '上线'),
(1, '下线'),
(2, '预上线'),
)
name = models.CharField(max_length=128, verbose_name="课程名称")
course_img = models.ImageField(upload_to="course", max_length=255, verbose_name="封面图片", blank=True, null=True)
course_type = models.SmallIntegerField(choices=course_type, default=0, verbose_name="付费类型")
# 使用这个字段的原因
brief = models.TextField(max_length=2048, verbose_name="详情介绍", null=True, blank=True)
level = models.SmallIntegerField(choices=level_choices, default=0, verbose_name="难度等级")
pub_date = models.DateField(verbose_name="发布日期", auto_now_add=True)
period = models.IntegerField(verbose_name="建议学习周期(day)", default=7)
attachment_path = models.FileField(upload_to="attachment", max_length=128, verbose_name="课件路径", blank=True,
null=True)
status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="课程状态")
course_category = models.ForeignKey("CourseCategory", on_delete=models.SET_NULL, db_constraint=False, null=True, blank=True,
verbose_name="课程分类")
students = models.IntegerField(verbose_name="学习人数", default=0)
lessons = models.IntegerField(verbose_name="总课时数量", default=0)
pub_lessons = models.IntegerField(verbose_name="课时更新数量", default=0)
price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="课程原价", default=0)
teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, null=True, blank=True, verbose_name="授课老师")
class Meta:
db_table = "luffy_course"
verbose_name = "课程"
verbose_name_plural = "课程"
def __str__(self):
return "%s" % self.name
@property
def teacher_name(self):
"""返回老师姓名"""
return self.teacher.name
@property
def section_list(self):
"""课程列表的推荐课时"""
# 获取当前课程的所有章节
coursechapter_list = self.coursechapters.filter(is_show=True, is_delete=False).order_by("orders")
# 通过循环当前磕碜的所有章节,来获取章节下面的所有课时
data_list = []
for coursechapter in coursechapter_list:
# 当前章节下的所有课时
coursesection_list = coursechapter.coursesections.filter(is_show=True, is_delete=False).order_by("orders")
# 循环每一个课时,逐个追加到data_list进行返回
for coursesection in coursesection_list:
if len(data_list) >= 4:
break
data_list.append({
"id": coursesection.id,
"name": coursesection.name,
"free_trail": coursesection.free_trail,
})
return data_list
序列化演变:course/serializers.py
class CourseSerializer(serializers.ModelSerializer):
"""课程列表的课程基本信息"""
# 序列化器嵌套[被嵌套的序列化器必须声明对应的字段为模型原有的外键字段,同时这个被嵌套的序列化器必须先声明才能进行调用!]
# 如果嵌套的序列化器数据有多条,则需要在调用序列化器时需要声明 many=True
teacher = TeacherSerializer()
class Meta:
model = Course
fields = ["id", "name", "course_img", "students", "sections", "pub_sections", "price", "teacher", 'section_list]
Django中实现单表和多表接口的更多相关文章
- Django中对单表的增删改查
之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.objects.creat ...
- Django中多对多关系的orm表设计
作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍 1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...
- django中 对Mysql数据库的建表
Django操作Mysql数据库: 1.1 在settings中,配置数据库相关参数,所以无需修改,这里我们看一下: DATABASES = { 'default': { # 这里可以指定使用的数据库 ...
- Django中利用type动态操作数据库表
场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000 ...
- Django中使用表单
使用表单 表单用 user 提交数据,是网站中比较重要的一个内容 GET 和 POST 方法 GET 和 POST 的区别 URL,全称是"统一资源定位符".用于对应互联网上的每一 ...
- Django中三种方式写form表单
除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...
- django中使用AJAX时如何获取表单参数(按钮携带参数)
前提是函数和相应的视图路由都已经配置好了,然后就是表单了: <form id="SmsForm" method="post" class="a& ...
- 在django中如何通过已有的mysql表生成django的model
第一步:先是在项目中建立一个app:python manage.py startapp app01 第二步:python manage.py inspectdb > app01/models.p ...
- Django中多表查询思路
需求: 1.有一张文章表和一张评论表 2.两张表的关系是一对多 3.规则:若是有新评论,则将对应的文章置顶,若是有新文章则将新文章置顶. 思路: 在文章表中增加一个最后评论时间的字段.然后采用分组排序 ...
随机推荐
- PAT 甲级 1144 The Missing Number (20 分)(简单,最后一个测试点没过由于开的数组没必要大于N)
1144 The Missing Number (20 分) Given N integers, you are supposed to find the smallest positive in ...
- Python - Django - simple_tag 和 inclusion_tag
simple_tag: simple_tag 和自定义 filter 类似,但可以接收更多更灵活的参数 在 app01/templatetags/ 目录下创建 mysimple_tag.py mysi ...
- [Log4j使用教程] JavaSE/JavaEE/SpringMVC中使用Log4j
要想使用Log4j, 首先需要下载到Log4j的jar, Download: http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log ...
- vi 替换命令 以及“找不到模式”解决
转自:https://www.cnblogs.com/zfyouxi/p/5181363.html 在linux vi编辑工具中使用替换命令操作时,会出现明明有匹配查找模式的数据.却报“找不到模式”问 ...
- [OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片
在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据. 这个时候,当你的应用程序读到内存里 ...
- HTTP权威指南-报文与状态码
所有的报文都向下流动 报文流向 报文组成 HTTP方法 状态码 GET示例 HEAD示例 100~199 信息性状态码 200~299 成功状态码 300~399重定向状态码 400~499 客户端错 ...
- Spring Boot制作启动图案
SpringBoot在启动时会有一个默认图案的,如果不喜欢可以自己制作一个. 在resources的目录下新建banner.txt文件. 制作图案地址:springboot启动图案定制 通过输入字符串 ...
- [Asp.Net Core] - 使用 ViewComponents 实现分页控件
分页控件(定义分页参数) ~/ViewComponents/PaginationViewComponent.cs using HelloWorld.DataContext; using Microso ...
- Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
1. 利用for循环遍历整个列表 magicians = ['alice', 'dsvid', 'carolina'] # 遍历整个列表 for magician in magicians: prin ...
- golang之 iota 常量生成器
常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式.在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每 ...