Django が音楽 Web サイトを実装⑻

Python Django フレームワークを使用して音楽 Web サイトを作成し、

この記事は主に、バックグラウンドでのシングルの本来の機能に基づいたいくつかの機能の実装と表示の最適化について説明します。

目次

新規編集

歌手ドロップダウン表示の変更

曲の長さを設定する

eyed3ライブラリをインストールする

MP3 の長さを取得する

曲の長さフィールドの変更

保存メソッドをオーバーライドする

歌手のシングル曲を増やす

歌手のシングル曲数を問い合わせる

リスト表示

アーティスト名を表示

歌手名を取得する

アーティスト名の表示を設定する

リストには曲の長さが表示されます

全体としての単一テーブル モデル

要約する


新規編集

歌手ドロップダウン表示の変更

追加時に対象として表示する歌手を選択することになりますが、歌手は確認できません。

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

曲の長さフィールドの変更

Singlee 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()

同時歌手シングル数

シングルを保存する場合、歌手シングルの数を処理し、シングルテーブルモデルの保存方法を変更し、最終保存の前に処理を追加します。

内容は以下の通りです。

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 = '歌手'

効果:

リストには曲の長さが表示されます

バックグラウンドで 1 つのカテゴリを変更し、曲の長さを表示するフィールドを追加します。

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)

要約する

主に編集とリストの 2 つの側面を追加することにより、バックグラウンドの単一モジュールの一部の機能を最適化します。

おすすめ

転載: blog.csdn.net/json_ligege/article/details/132173071