You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在model.py中实现Music模型自动检查并创建Artist模型数据

解决方案

首先需要调整模型结构,建立Music与Artist的正确关联,同时通过自定义Admin表单实现自动创建艺术家的逻辑:

1. 修改模型代码(models.py)

from django.db import models

class Artist(models.Model):
    name = models.CharField(max_length=100, unique=True)  # 确保艺术家名称唯一,避免重复创建

    def __str__(self):
        return self.name

class Music(models.Model):
    name = models.CharField(max_length=100, verbose_name="音乐名称")
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE, verbose_name="艺术家")
    genre = models.CharField(max_length=100, verbose_name="流派")

    def __str__(self):
        return f"{self.name} - {self.artist.name}"

关键修改说明:

  • 给Artist的name字段添加unique=True,防止重复创建同名艺术家
  • 将Music中的artist字段从CharField改为ForeignKey,建立与Artist的关联,消除数据冗余,符合数据库设计规范

2. 自定义Admin表单与配置(admin.py)

from django.contrib import admin
from django import forms
from .models import Artist, Music

class MusicAdminForm(forms.ModelForm):
    # 添加用于输入艺术家名称的字段,替代默认的下拉选择框
    artist_name = forms.CharField(max_length=100, label="艺术家名称")

    class Meta:
        model = Music
        fields = ["name", "artist_name", "genre"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 编辑已有音乐时,自动填充当前关联的艺术家名称
        if self.instance.pk:
            self.initial["artist_name"] = self.instance.artist.name

    def save(self, commit=True):
        # 使用get_or_create方法:存在则获取,不存在则创建艺术家
        artist, _ = Artist.objects.get_or_create(name=self.cleaned_data["artist_name"])
        self.instance.artist = artist
        return super().save(commit=commit)

class MusicAdmin(admin.ModelAdmin):
    form = MusicAdminForm
    list_display = ["name", "artist", "genre"]  # 列表页显示的字段

admin.site.register(Artist)
admin.site.register(Music, MusicAdmin)

逻辑说明:

  • 自定义MusicAdminForm,新增artist_name字段让用户直接输入艺术家名称,而非从下拉列表选择
  • 在表单的save方法中,通过get_or_create自动处理艺术家的存在性检查:
    • 如果输入的名称已在Artist表中存在,直接获取该艺术家实例
    • 如果不存在,自动创建新的Artist记录
  • 编辑已有音乐时,表单会自动填充当前关联的艺术家名称,提升操作体验

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:52:50