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)

总结

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

相关推荐
veminhe16 分钟前
元数据索引有关的错
人工智能·python
Csvn17 分钟前
📊 SQL 入门 Day 11:CASE 表达式:SQL 里的 if-else 魔法
后端·sql
一次旅行19 分钟前
AutoAWQ完整实战:MIT激活感知AWQ量化,模型显存减半、推理提速且精度无损
人工智能·python·算法
QQ_216962909619 分钟前
Spring Boot 养老院管理系统:从入住、护理到费用结算的全流程实现(源码可领)
java·spring boot·后端
GrowthDiary00739 分钟前
算法题:寻找二维数组top k问题
数据结构·python·算法
丙氨酸長鏈1 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
旋生万物2 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai
久久学姐2 小时前
【AI问答】python引入其他模块的对象
python·绝对导入·相对导入·目录结构·模块导入
万少3 小时前
DeepSeek-V4-Flash 正式版上线了,但这 3 个坑我帮你提前踩了
前端·javascript·后端
明月_清风3 小时前
🚀 Palantir Foundry 本体论实战:当 Ontology 从"知识图谱"进化为"企业操作系统"
前端·后端