对Django Model对象进行“永久性”更改

时间:2013-12-15 10:00:54

标签: python django django-models

我从Beatport API获取有关特定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()

这会将歌曲模型中当前不存在的歌曲添加到乐曲模型中。

现在很多歌曲在歌曲名称字段中存在一些差异,并且由于歌曲名称的差异很小,因此很多歌曲都会重复出现。不可能编写代码来区分它们中的每一个。我可以使用管理员编辑它们但我需要不时重新运行此代码以使用新歌曲更新Song模型。当我再次运行代码时,如何编辑或删除某些特定的Song对象而不对它们进行读取?

2 个答案:

答案 0 :(得分:0)

您可以创建第二个包含同义歌曲名称的模型,例如:

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

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

答案 1 :(得分:0)

您可以尝试在Song模型上引入其他字段,以存储歌曲名称的规范化版本。在存储新歌曲之前,您将检查规范化名称是否与数据库中任何现有歌曲的规范化名称相匹配。

归一化可以通过

的组合来完成
  • 下限歌曲名称
  • 用(单个)下划线替换空格
  • 用下划线替换连字符
  • 删除任何特殊字符(方括号,括号等)
  • 用下划线替换点。

这应该消除大部分重复。

上面列出的操作的代码示例:

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

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