Django实现音乐网站 ⑻

使用Python Django框架制作一个音乐网站,

本篇主要是后台对单曲原有功能的基础上进行部分功能实现和显示优化。

目录

新增编辑

歌手下拉显示修改

设置歌曲时长

安装eyed3库

获取mp3时长

歌曲时长字段修改

重写save方法

增加歌手单曲数量

查询歌手单曲数量

列表显示

显示歌手名称

获取歌手名称

设置歌手名称显示

列表显示歌曲时长

单曲表模型整体

总结


新增编辑

歌手下拉显示修改

新增时选择歌手显示为对象,无法确认歌手。

需修改Singler表模型,增加__str__方法

内容如下:

python 复制代码
def __str__(self):
    """ 修改返回格式 """

    return self.name

效果:

设置歌曲时长

歌曲时长的值从输入框填写改为后台设置为读取歌曲文件获取的时长。

安装eyed3库

命令如下:

bash 复制代码
pip install eyed3

获取mp3时长

内容如下:

python 复制代码
import eyed3


def get_duration_mp3(file_path):
    """ 获取mp3音频文件时长 """

    info = eyed3.load(file_path)
    return info.info.time_secs

歌曲时长字段修改

修改Singe Model类

首先把歌曲时长字段设置为admin不可改写。

python 复制代码
duration = models.IntegerField(editable=False)

重写save方法

在重写save方法的内部,需要先调取父类保存方法后文件会被保存到相应路径,

之后才会有文件路径,读取MP3文件获取文件时长后,再存储一次;至于简单的方法因为对django还在学习中,暂时没发现。

python 复制代码
def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
    """ 重写save方法 处理歌曲时长 """

    super().save()
    #get_singe_singler_num(self.singler)
    path_name = str(self.path.name)
    if path_name.endswith(".mp3"):
        save_path = os.path.join(settings.MEDIA_ROOT, path_name)
        print(save_path)
        self.duration = get_duration_mp3(save_path)
        print(self.duration)
    super().save()

增加歌手单曲数量

需要在增加相应歌手关联单曲时同时增加该歌手的单曲数量。

查询歌手单曲数量

在player/models.py中新增方法,通过单曲表歌手外键id查询相应歌手拥有单曲数量。

内容如下:

python 复制代码
def get_singe_singler_num(singler_id):
    """
    获取单曲表中所属歌手数
    :param singler_id:
    :return:
    """
    return Singe.objects.filter(singler_id=singler_id).count()

同步歌手单曲数量

单曲保存时处理歌手单曲数量,修改单曲表模型save方法,在最后保存前增加处理。

内容如下:

python 复制代码
def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
    """ 重写save方法 处理歌曲时长 歌手单曲数量 """

    super().save()
    path_name = str(self.path.name)
    if path_name.endswith(".mp3"):
        save_path = os.path.join(settings.MEDIA_ROOT, path_name)
        self.duration = get_duration_mp3(save_path)
    # 获取相应歌手单曲数
    singe_num = get_singe_singler_num(self.singler_id)
    # 更新相应歌手的单曲数
    Singler.objects.filter(pk=self.singler_id).update(singe_num=singe_num)
    super().save()

列表显示

显示歌手名称

单曲列表关联歌手外键id,如果需要显示歌手名称,也需要修改否则只显示外键id。

获取歌手名称

在player/admin.py中设置方法,通过外键id去查询相应歌手信息。

内容如下:

python 复制代码
def get_singler_name(id):
    """
    获取歌手名称
    :param id:歌手id
    :return:
    """
    return Singler.objects.get(pk=id)

设置歌手名称显示

修改后台单曲类中外键字段自定义显示处理。

python 复制代码
class SingeAdmin(admin.ModelAdmin):
    """ 后台单曲类 """

    ......

    def get_singler_id(self):
        return get_singler_name(self.singler_id)

    get_singler_id.short_description = '歌手'

效果:

列表显示歌曲时长

修改后台单曲类,增加显示歌曲时长字段。

python 复制代码
def get_duration(self):
    return self.duration

get_duration.short_description = '时长(s)'

# 显示字段
list_display = ['id', get_name, get_singler_id, get_duration, get_addtime, get_updatetime]

单曲表模型整体

python 复制代码
class Album(BaseModel):
    """ 专辑表 """

    class Meta:
        verbose_name = '专辑'
        verbose_name_plural = '专辑'

    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, editable=False)

    langs = [('国语', '国语'), ('普通话', '普通话'), ('英语', '英语'), ('日韩', '日韩')]
    single_lang = models.CharField('专辑语种', max_length=50, choices=langs, help_text='请选择专辑语种')

    # 设置与歌手表关联外键 一对多
    singler = models.ForeignKey("Singler", on_delete=models.CASCADE, verbose_name='歌手', help_text='请选择歌手')

    # 设置与单曲表关联外键 多对多
    Singe = models.ManyToManyField('Singe', verbose_name='单曲', help_text='请选择单曲')

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        """ 重写save方法 处理单曲数和歌手专辑数 """

        # 获取选中的单曲字典
        sing_set = self.Singe.all()
        single_num = len(sing_set)
        # 更新单曲数
        self.single_num = single_num

        # 获取所属歌手专辑数
        album_num = get_album_singler_num(self.singler_id)

        super().save()
        # 更新歌手表-专辑数
        Singler.objects.filter(pk=self.singler_id).update(album_num=album_num)

总结

对后台单曲模块进行部分功能优化,主要通过新增编辑和列表两方面来进行优化。

相关推荐
用户21411832636026 分钟前
手把手教你用Claude制作专属PPT生成器-从模板学习到自动生成全流程实战
后端
dagouaofei26 分钟前
AI生成个性化年终总结PPT
人工智能·python·powerpoint
white-persist2 小时前
VSCode 快捷键大全:从设计理念到场景化高效运用(详细解析)(文章末尾有vim快捷键大全)
linux·ide·vscode·python·编辑器·系统安全·vim
liliangcsdn2 小时前
python threading异步并发调用示例
python
计算机毕设匠心工作室2 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
摆烂工程师2 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
码界奇点2 小时前
基于Python与Pygame的多功能游戏系统设计与实现
python·游戏·毕业设计·pygame·源代码管理
qq_12498707532 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
万邦科技Lafite2 小时前
一键获取淘宝店铺所有商品信息,实时监控商品数据
开发语言·数据库·python·api·开放api·电商开放平台·淘宝开放平台
代码与野兽3 小时前
AI交易,怎么让LLM自己挑选数据源?
前端·javascript·后端