Django实现音乐网站 ⑷

news2024/11/15 11:08:10

使用Python Django框架制作一个音乐网站,在系列文章3的基础上继续开发,

本篇主要是后台歌曲类型表、歌单表模块功能开发。

 

目录

表结构设计

歌曲类型表结构

歌单表结构

创建表模型

创建表

后台注册表模型

引入表模型

后台自定义

总结


表结构设计

歌曲类型表结构

字段

类型

注释

id

int(11)

自增id

name

varchar(100)

歌单名称

pid

int(11)

父类型id 0表明为父类

歌单表结构

字段

类型

注释

id

int(11)

name

varchar(100)

歌单名称

cover

varchar(100)

封面路径

playnum

int(11)

播放量

is_default

tinyint(2)

是否默认 0否 1是

addtime

int(11)

添加时间

updatetime

int(11)

更新时间

创建表模型

还是在player/models.py中添加。歌单表与类型表是多对多关系,中间表不需要创建,

只需要声明好关系,django会自动创建相应中间表。

内容如下:

class SongCategory(models.Model):
    """ 歌曲类型表 """

    name = models.CharField(max_length=100, help_text='请输入类型名称')
    pid = models.IntegerField(default=0, help_text='父类型id')


class SongSheet(models.Model):
    """ 歌单表 """

    name = models.CharField(max_length=100, help_text='请输入歌单名称')
    cover = models.ImageField(upload_to=upload_save_path, help_text='请上传歌单封面图')
    playnum = models.IntegerField(default=0, help_text='请输入播放量')
    
    # 输入框改为下拉菜单
    is_default = models.IntegerField(default=0, choices=[('0', '是'), ('1', '否')], help_text='是否默认')
    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

    # 歌曲类型与歌单表 多对多关系
    category = models.ManyToManyField('SongCategory')

    # 歌单表与单曲表多对多关系
    singe = models.ManyToManyField('Singe')

注意:可通过choices参数把输入框改为下拉菜单。

创建表

python manage.py makemigrations

python manage.py migrate

创建了四个表,分别为歌曲类型表、歌单表、歌单类型表、歌单单曲表;

歌曲类型表和歌单表结构与表结构设计相同,不再展示;

中间表结构如下:

CREATE TABLE `player_songsheet_singe` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `songsheet_id` bigint(20) NOT NULL,
  `singe_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `player_songsheet_singe_songsheet_id_singe_id_78f26d1c_uniq` (`songsheet_id`,`singe_id`),
  KEY `player_songsheet_singe_songsheet_id_2375e76e` (`songsheet_id`),
  KEY `player_songsheet_singe_singe_id_022e51d3` (`singe_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;


CREATE TABLE `player_songsheet_category` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `songsheet_id` bigint(20) NOT NULL,
  `songcategory_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `player_songsheet_categor_songsheet_id_songcategor_d9f0af95_uniq` (`songsheet_id`,`songcategory_id`),
  KEY `player_songsheet_category_songsheet_id_80b16cc8` (`songsheet_id`),
  KEY `player_songsheet_category_songcategory_id_397ab572` (`songcategory_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

可以看出中间表字段关系与设计相符,并且相应索引都已经创建。

 

后台注册表模型

在player/admin.py中操作。

引入表模型

from .models import SongCategory, SongSheet

 

后台自定义

修改默认的显示、过滤、搜索、分页。

class SongCategoryAdmin(admin.ModelAdmin):

    def get_name(self):
        return self.name

    get_name.short_description = '类型名称'

    def get_pid(self):
        return self.pid

    get_pid.short_description = '类型父id'

    # 显示字段
    list_display = ['id', get_name, get_pid]
    # 过滤器
    list_filter = ['name']
    # 搜索
    search_fields = ['name']
    # 分页
    list_per_page = 10


class SongSheetAdmin(admin.ModelAdmin):

    def get_name(self):
        return self.name

    get_name.short_description = '类型名称'

    def get_cover(self):
        return self.cover

    get_cover.short_description = '歌单封面'

    def get_playnum(self):
        return self.playnum

    get_playnum.short_description = '播放量'

    def get_isdefault(self):
        return '是' if self.is_default else '否'

    get_isdefault.short_description = '是否默认'

    get_playnum.short_description = '播放量'

    def get_addtime(self):
        return self.addtime

    get_addtime.short_description = '创建时间'

    def get_updatetime(self):
        return self.updatetime

    # 显示字段
    list_display = ['id', get_name, get_cover]
    # 过滤器
    list_filter = ['name']
    # 搜索
    search_fields = ['name']
    # 分页
    list_per_page = 10

admin.site.register(SongCategory, SongCategoryAdmin)
admin.site.register(SongSheet, SongSheetAdmin)

效果:

 

总结

表结构的设计和创建,包括后台注册操作起来大致相同,多创建一些表熟练了就简单了;

至此数据表设计和创建基本完成,下一步就是数据添加和后台使用优化了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线考试系统ssm学生线上答疑问答试卷管理java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 在线考试系统ssm 系统有1权限:管理员 二…

Docker Compose构建lnmp

目录 Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Compose的优点 先来了解一下我们平时是怎么样使用docker的?把它进行拆分一下: 1…

低代码已经发展到什么水平了?

在数字化转型的浪潮下,企业和组织迫切需要更快速、高效的应用开发方式来满足日益复杂的业务需求。而低代码开发作为一种创新的开发方式,正在引领着应用开发的新潮流。低代码开发允许开发者以可视化的方式快速构建应用,减少了繁琐的代码编写&a…

微服务——elasticsearch

初识ES——什么是elasticsearch elasticsearch的发展 初识ES——正向索引和倒排索引 初识ES——es与mysql的概念对比 类比到mysql中是表结构约束 概念对比 初始ES——安装es和kibana 1.部署单点es 1.1创建网络 要安装es容器和kibana容器并让他们之间相连,这里…

编辑接口和新增接口的分别调用

在后台管理系统中,有时候会碰到新增接口和编辑接口共用一个弹窗的时候. 一.场景 在点击新增或者编辑的时候都会使用这个窗口,新增直接调用接口进行增加即可,编辑则是打开这个窗口显示当前行的数据,然后调用编辑接口。 二.处理方法 在默认的情况下,这个窗口用来处理…

AOP的实战(统一功能处理模块)

一、用户登录权限效验 用户登录权限的发展从之前每个方法中自己验证用户登录权限,到现在统一的用户登录验证处理,它是一个逐渐完善和逐渐优化的过程。 1.1 最初用户登录验证 我们先来回顾一下最初用户登录验证的实现方法: RestController…

Android入门教程||Android 架构||Android 应用程序组件

Android 架构 Android 操作系统是一个软件组件的栈,在架构图中它大致可以分为五个部分和四个主要层。 Linux内核 在所有层的最底下是 Linux - 包括大约115个补丁的 Linux 3.6。它提供了基本的系统功能,比如进程管理,内存管理,设…

Redis的缓存穿透、缓存击穿和缓存雪崩

目录 一、解释说明 二、缓存穿透 1. 什么是缓存穿透? 2. 常见的两种解决方案 (1)缓存空对象 (2)布隆过滤 3. 编码解决商品查询的缓存穿透问题 三、缓存雪崩 1. 什么是缓存雪崩? 2. 缓存雪崩解决方…

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!! 同步收录 👇 蓝桥杯上岸必背!!!(第四期DFS) 大家好 我是寸铁💪 冲刺蓝桥杯省一模板大全来啦 🔥 蓝桥杯4月8号就要开始了 &a…

JS中的原型和原型链

原型 1.普通对象 每个对象都有一个__proto__属性,该属性指向对象的原型属性 const obj { name: 张三 }console.log(obj, obj.__proto__);console.log(Object, Object.prototype);我们可以得出:obj.proto Object.prototype console.log(obj.__proto__ Object.pr…

【黑马程序员前端】JavaScript入门到精通(2)--20230801

B站链接 【黑马程序员前端】JavaScript入门到精通(1)–20230801 【黑马程序员前端】JavaScript入门到精通(2)–20230801 2.web APIs资料(续前) web APIs第六天 01-正则表达式的使用 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

谷歌创始人布林重返职场,投入研发AI杀手锏!预计下半年推出下一代通用模型『Gemini』,和OpenAI的终局之战!

夕小瑶科技说 原创 作者 | 王思若 大家好&#xff0c;我是王思若。在大模型混战的当下&#xff0c;去繁就简&#xff0c;最核心的目标或者使命始终是通用人工智能AGI&#xff0c;但目前而言&#xff0c;也只有OpenAI和Google可能会在这个需要海量算力支撑和资金支持的方向上构…

【Spring】AOP切点表达式

文章目录 1、语法2、通配符3、execution4、within5、annotation6、args7、args8、bean9、this10、target11、target12、within13、表达式组合14、补充 1、语法 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名) 举例&#xff1a; execution(public User c…

frida学习及使用

文章目录 安装frida安装python3.7设置环境变量安装pycharm和nodejs 使用frida将frida-server push到手机设备中端口转发安装apk使用jadx查看java代码运行frida-server frida源码阅读frida hook方法Frida Java层hoookJavaHook.javaJavaHook.js Frida native层hook 一NativeHook.…

【Leetcode】(自食用)找到消失的数字

step by step. 题目&#xff1a; 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输…

模板方法模式——定义算法的框架

1、简介 1.1、概述 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基本方法中。在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法…

js沙箱逃逸

目录 一、什么是沙箱(sandbox) 二、沙箱技术的实现 & node.js 2.1简单沙箱程序示例 2.2this.tostring S1&#xff1a; S2&#xff1a; 三、arguments.callee.caller 一、什么是沙箱(sandbox) 在计算机安全性方面&#xff0c;沙箱&#xff08;沙盒、sanbox&#xff…

【【萌新的STM32学习-4】】

萌新的STM32学习-4 STM32系统框架 1.1 Cortex M 内核& 芯片 F1有四个驱动单元 四个被动单元 AHB 高级高性能总线 APB 高级外围总线 部分系统结构 最上面的ICode 总线直接连接到了内部Flash 不需要通过总线矩阵 . D Code 总线&#xff08;D - Bus&#xff09; 这是Cort…

Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

Delphi Enterprise Crack

Delphi Enterprise Crack Delphi帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Enterprise适合开发团队构建客户端/服务器或多层应用程序、REST服务等。 Delphi功能 单一代码库-用更少的编码工作为所有主要…