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)

效果:

总结

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

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

相关推荐
FreakStudio28 分钟前
一文速通 Python 并行计算:13 Python 异步编程-基本概念与事件循环和回调机制
python·pycharm·协程·多进程·并行计算·异步编程
姑苏洛言1 小时前
编写产品需求文档:黄历日历小程序
前端·javascript·后端
姑苏洛言2 小时前
搭建一款结合传统黄历功能的日历小程序
前端·javascript·后端
你的人类朋友2 小时前
🍃认识一下boomi
后端
苏三说技术2 小时前
MySQL的三大日志
后端
豌豆花下猫2 小时前
让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
后端·python·ai
夏末蝉未鸣012 小时前
python transformers库笔记(BertForTokenClassification类)
python·自然语言处理·transformer
南雨北斗3 小时前
TP6使用PHPMailer发送邮件
后端
你的人类朋友3 小时前
🤔什么时候用BFF架构?
前端·javascript·后端
weixin_418813874 小时前
Python-可视化学习笔记
笔记·python·学习