Django实现音乐网站 ⑶

使用Python Django框架制作一个音乐网站,在系列文章2的基础上继续开发,本篇主要是后台单曲、专辑、首页轮播图表模块开发。

目录

后台单曲、专辑表模块开发

表结构设计

单曲表(singe)结构

专辑表(album)结构

创建表模型

创建表

后台注册表模型

后台首页轮播图表模块开发

表结构设计

创建表模型

创建表

后台注册表模型

引入表模型

后台自定义

总结


后台单曲、专辑表模块开发

表结构设计

单曲表(singe)结构

|------------|--------------|------------|
| 字段 | 类型 | 注释 |
| id | int(11) | 单曲id |
| sid | int(11) | 所属歌手id |
| aid | int(11) | 所属专辑id |
| name | varchar(50) | 单曲名称 |
| duration | int(11) | 时长(ms) |
| path | varchar(200) | 歌曲文件链接 |
| lyric | varchar(200) | 歌词文件链接 |
| addtime | int(11) | 发行时间 |
| updatetime | int(11) | 编辑时间 |

专辑表( album )结构

|------------|--------------|------------|
| 字段 | 类型 | 注释 |
| id | int(11) | 单曲id |
| singler_id | int(11) | 所属歌手id |
| name | varchar(50) | 专辑名称 |
| cover | varchar(255) | 专辑封面 |
| desc | varchar(255) | 专辑简介 |
| single_num | int(11) | 单曲数 |
| lang | varchar(50) | 专辑语种 |
| addtime | int(11) | 创建时间 |
| updatetime | int(11) | 更新时间 |

创建表模型

在player工程目录下的models.py中创建表模型。

专辑和单曲表关系为多对多,需要设置一个中间关系表;在django中多对多关系,不需要主动设置,会自动创建一个隐藏中间表。

内容如下:

python 复制代码
class Singe(models.Model):
    """ 单曲表 """

    name = models.CharField(max_length=50, help_text='请输入单曲名称')
    duration = models.IntegerField(help_text='请输入歌曲时长(ms)')
    path = models.FileField(upload_to=upload_save_path, help_text='请上传歌曲')
    lyric = models.FileField(upload_to=upload_save_path, help_text='请上传歌曲单词')
    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

    # 设置与歌手表关联外键
    # 一对多外键设置在多的模型中
    singler = models.ForeignKey("Singler", on_delete=models.CASCADE)


class Album(models.Model):
    """ 专辑表 """

    name = models.CharField(max_length=50, help_text='请输入专辑名称')
    cover = models.ImageField(upload_to=upload_save_path, help_text='请上传专辑封面图')
    desc = models.CharField(max_length=255, help_text='请输入专辑描述')
    single_num = models.IntegerField(default=0, help_text='请输入单曲数')
    single_lang = models.CharField(max_length=50, help_text='请输入专辑语种')
    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

    # 设置与歌手表关联外键 一对多 级联删除
    singler = models.ForeignKey("Singler", on_delete=models.CASCADE)

    # 设置与单曲表关联外键 多对多
    Singe = models.ManyToManyField('Singe')

创建表

bash 复制代码
python manage.py makemigrations

python manage.py migrate

这两条命令执行结束后,数据库增加player_album、player_singe表及关系表player_album_singe

表结构如下:

sql 复制代码
CREATE TABLE `player_album` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `cover` varchar(100) NOT NULL,
  `desc` varchar(255) NOT NULL,
  `single_num` int(11) NOT NULL,
  `single_lang` varchar(50) NOT NULL,
  `addtime` datetime(6) NOT NULL,
  `updatetime` datetime(6) NOT NULL,
  `singler_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `player_album_singler_id_cde08698` (`singler_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

CREATE TABLE `player_singe` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `duration` int(11) NOT NULL,
  `path` varchar(100) NOT NULL,
  `lyric` varchar(100) NOT NULL,
  `addtime` datetime(6) NOT NULL,
  `updatetime` datetime(6) NOT NULL,
  `singler_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `player_singe_singler_id_103f9b74` (`singler_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

CREATE TABLE `player_album_singe` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `album_id` bigint(20) NOT NULL,
  `singe_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `player_album_Singe_album_id_singe_id_5df36ff3_uniq` (`album_id`,`singe_id`),
  KEY `player_album_Singe_album_id_2148d063` (`album_id`),
  KEY `player_album_Singe_singe_id_f3856b29` (`singe_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

后台注册表模型

在player目录下admin.py中注册单曲、专辑表模型到后台。

增加自定义上传文件路径方法设置。

python 复制代码
def upload_save_path(instance, filename):
    """ 上传文件保存路径 """

    return 'uploads/' + str(int(time.time())) + '/{0}'.format(filename)


class Singe(models.Model):
    """ 单曲表 """

    name = models.CharField(max_length=50, help_text='请输入单曲名称')
    duration = models.IntegerField(help_text='请输入歌曲时长(ms)')
    path = models.FileField(upload_to=upload_save_path, help_text='请上传歌曲')
    lyric = models.FileField(upload_to=upload_save_path, help_text='请上传歌曲单词')
    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

    # 设置与歌手表关联外键
    # 一对多外键设置在多的模型中
    singler = models.ForeignKey("Singler", on_delete=models.CASCADE)
    # 设置与专辑表关联外键
    album = models.ForeignKey("Album", on_delete=models.CASCADE)


class Album(models.Model):
    """ 专辑表 """

    name = models.CharField(max_length=50, help_text='请输入专辑名称')
    cover = models.ImageField(upload_to=upload_save_path, help_text='请上传专辑封面图')
    desc = models.CharField(max_length=255, help_text='请输入专辑描述')
    single_num = models.IntegerField(default=0, help_text='请输入单曲数')
    single_lang = models.CharField(max_length=50, help_text='请输入专辑语种')
    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

    # 设置与歌手表关联外键
    singler = models.ForeignKey("Singler", on_delete=models.CASCADE)

admin.site.register(Singe, SingeAdmin)
admin.site.register(Album, AlbumAdmin)

效果:

外键的设置,主要在添加的时候进行下拉菜单关联添加。

后台首页轮播图表模块开发

表结构设计

|------------|--------------|------------|
| 字段 | 类型 | 注释 |
| id | int(11) | 自增id |
| path | varchar(100) | 图片路径 |
| href | varchar(100) | 跳转路径 |

创建表模型

自增id不需指定,默认自动添加。

python 复制代码
class Carousel(models.Model):
    """ 首页轮播图 """

    path = models.ImageField(upload_to=upload_save_path, help_text='请选择上传首页轮播图')
    href = models.CharField(max_length=100, help_text='请输入点击图片后跳转路径')

创建表

bash 复制代码
python manage.py makemigrations

python manage.py migrate

执行过程:

后台注册表模型

在player/admin.py中添加轮播表模型,并注册。

引入表模型

python 复制代码
from .models import Carousel

后台自定义

python 复制代码
class CarouselAdmin(admin.ModelAdmin):


    # 列表页属性
    def get_path(self):
        return self.path

    get_path.short_description = '图片路径'

    def get_href(self):
        return self.href

    get_href.short_description = '跳转路径'

    # 显示字段
    list_display = ['id', get_path, get_href]


admin.site.register(Carousel, CarouselAdmin)

效果:

总结

还是创建表模型到后台注册流程,增加了自定义上传文件设置,还有两种外键设置的方式:分别为一对多和多对多类型,其中一对多设置删除为级联方式,也就是删除一时多的一方也会被删除。

相关推荐
Freak嵌入式10 分钟前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
java·开发语言·数据结构·python·接口·抽象基类
crownyouyou20 分钟前
最简单的一文安装Pytorch+CUDA
人工智能·pytorch·python
鸽芷咕24 分钟前
【Python报错已解决】libpng warning: iccp: known incorrect sRGB profile
开发语言·python·机器学习·bug
WenGyyyL24 分钟前
变脸大师:基于OpenCV与Dlib的人脸换脸技术实现
人工智能·python·opencv
白总Server30 分钟前
MongoDB解说
开发语言·数据库·后端·mongodb·golang·rust·php
laofashi201531 分钟前
AirTest 基本操作范例和参数解释(一)
python·自动化·automation
XyLin.32 分钟前
Msf之Python分离免杀
开发语言·python·网络安全·系统安全
Snowbowღ41 分钟前
OpenAI / GPT-4o:Python 返回结构化 / JSON 输出
python·json·openai·api·gpt-4o·pydantic·结构化输出
计算机学姐42 分钟前
基于python+django+vue的家居全屋定制系统
开发语言·vue.js·后端·python·django·numpy·web3.py
ac-er88881 小时前
常见的反爬虫和应对方法
开发语言·python