Django实现音乐网站 ⑷

使用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会自动创建相应中间表。

内容如下:

python 复制代码
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参数把输入框改为下拉菜单。

创建表

bash 复制代码
python manage.py makemigrations

python manage.py migrate

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

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

中间表结构如下:

sql 复制代码
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中操作。

引入表模型

python 复制代码
from .models import SongCategory, SongSheet

后台自定义

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

python 复制代码
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)

效果:

总结

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

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

相关推荐
弈栈录几秒前
MySQL 事务、索引与锁:后端开发必须掌握的数据库基础
数据库·后端
明月_清风1 分钟前
AI Agent 最大的问题,可能不是智商,而是“权限”
人工智能·后端
vx_Biye_Design5 分钟前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
长安米粒贵6 分钟前
缓存明明加了,为什么数据还是不一致?聊聊 4 个容易忽略的边界
后端
yunwei379 分钟前
eBPF 开发实践:使用 eBPF 隐藏进程或文件信息
linux·后端·性能优化
高频因子挖掘机11 分钟前
行情监控脚本重启后,怎样快速恢复而不重复拉取数据?
后端·github·api
aleafboat13 分钟前
只管去写(day2) 用claude分析老项目技术栈
后端
vx_Biye_Design19 分钟前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
用户77139702070621 分钟前
.NET 依赖注入入门
后端
泡茶喝茶写代码21 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 5 篇):板块成分股映射与对齐
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口