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中多对多关系,不需要主动设置,会自动创建一个隐藏中间表。

内容如下:

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')

创建表

python manage.py makemigrations

python manage.py migrate

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

表结构如下:

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中注册单曲、专辑表模型到后台。

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

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不需指定,默认自动添加。

class Carousel(models.Model):
    """ 首页轮播图 """

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

创建表

python manage.py makemigrations

python manage.py migrate

执行过程:

后台注册表模型

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

引入表模型

from .models import Carousel

后台自定义

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)

效果:

总结

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

猜你喜欢

转载自blog.csdn.net/json_ligege/article/details/132048211