对Django模型对象进行“永久”更改

2024-10-02 00:23:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我从BeatPortAPI获得了关于某个DJ的歌曲的详细信息,如下所示。你知道吗

if not get_obj_or_none(Song, name__iexact=song_name, artist=dj):
    s = Song(song_id=song['id'], name=song_name, artist=dj, release_date=song['releaseDate'])
    s.save()

这会将当前不在歌曲模型中的歌曲添加到歌曲模型中。你知道吗

现在很多歌曲在歌名字段有一些差异,很多歌曲因为歌名的细微差异而被重复。不可能编写代码来区分它们。我可以编辑他们使用管理,但我需要重新运行这个代码不时更新歌曲模型与新的歌曲。当我再次运行代码时,如何编辑或删除一些特定的歌曲对象而不读取它们?你知道吗


Tags: 代码name模型id编辑ifsongartist
2条回答

您可以尝试在Song模型中引入一个附加字段,用于存储歌曲名称的标准化版本。在存储新歌之前,您将检查规范化名称是否与数据库中任何现有歌曲的规范化名称匹配。你知道吗

标准化可以通过以下方法的组合来实现

  • 降低歌曲名称的大小写
  • 用(单个)下划线替换空格
  • 用下划线替换连字符
  • 删除任何特殊字符(方括号、圆括号等)
  • 用下划线替换点。你知道吗

这将消除大量的重复项。你知道吗

上述操作的代码示例:

  • song_name.lower()
  • re.sub(' +', '_', song_name)
  • re.sub('-+', '_', song_name)
  • re.sub('[\(\)\[\]]', '', song_name)
  • re.sub('\.+', '_', song_name)

用下划线替换空格/连字符/点的操作当然可以合并。你知道吗

您可以创建第二个模型来保存同义歌曲名称,例如:

class SongSynonym(models.Model):
    name = models.CharField(...)
    artist = models.ForeignKey(...)
    song = models.ForeignKey(Song)

并在创建新的Song之前检查是否存在SongSynonym

相关问题 更多 >

    热门问题