使用Python Django框架制作一个音乐网站,
本篇主要是后台对单曲原有功能的基础上进行部分功能实现和显示优化。
目录
新增编辑
歌手下拉显示修改
设置歌曲时长
安装eyed3库
获取mp3时长
歌曲时长字段修改
重写save方法
增加歌手单曲数量
查询歌手单曲数量
列表显示
显示歌手名称
获取歌手名称
设置歌手名称显示
列表显示歌曲时长
单曲表模型整体
总结
新增编辑
歌手下拉显示修改
新增时选择歌手显示为对象,无法确认歌手。
需修改Singler表模型,增加__str__方法
内容如下:
def __str__(self):
""" 修改返回格式 """
return self.name
效果:
设置歌曲时长
歌曲时长的值从输入框填写改为后台设置为读取歌曲文件获取的时长。
安装eyed3库
命令如下:
pip install eyed3
获取mp3时长
内容如下:
import eyed3
def get_duration_mp3(file_path):
""" 获取mp3音频文件时长 """
info = eyed3.load(file_path)
return info.info.time_secs
歌曲时长字段修改
修改Singe Model类
首先把歌曲时长字段设置为admin不可改写。
duration = models.IntegerField(editable=False)
重写save方法
在重写save方法的内部,需要先调取父类保存方法后文件会被保存到相应路径,
之后才会有文件路径,读取MP3文件获取文件时长后,再存储一次;至于简单的方法因为对django还在学习中,暂时没发现。
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查询相应歌手拥有单曲数量。
内容如下:
def get_singe_singler_num(singler_id):
"""
获取单曲表中所属歌手数
:param singler_id:
:return:
"""
return Singe.objects.filter(singler_id=singler_id).count()
同步歌手单曲数量
单曲保存时处理歌手单曲数量,修改单曲表模型save方法,在最后保存前增加处理。
内容如下:
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去查询相应歌手信息。
内容如下:
def get_singler_name(id):
"""
获取歌手名称
:param id:歌手id
:return:
"""
return Singler.objects.get(pk=id)
设置歌手名称显示
修改后台单曲类中外键字段自定义显示处理。
class SingeAdmin(admin.ModelAdmin):
""" 后台单曲类 """
......
def get_singler_id(self):
return get_singler_name(self.singler_id)
get_singler_id.short_description = '歌手'
效果:
列表显示歌曲时长
修改后台单曲类,增加显示歌曲时长字段。
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]
单曲表模型整体
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)
总结
对后台单曲模块进行部分功能优化,主要通过新增编辑和列表两方面来进行优化。