Mongoengine 和 add_to_set 似乎没有工作
Mongoengine and add_to_set doesn't seem to be working
我正在尝试将对 mp3 的引用保存到数据库中。我将艺术家、歌曲和专辑保存到它们各自的模式中,并通过 ReferenceFields 在它们之间进行引用。
我正在使用 eyeD3 解析 id3 数据(如果有)并将其保存到数据库中。我的问题是我想同时保存所有三种模式类型,但我可能会以错误的方式进行处理。我正在使用 python 2.7.10.
示例模式:
class Artist(db.Document):
"""Schema for Artist"""
name = db.StringField(max_length=255, required=True, unique=True)
albums = db.ListField(db.ReferenceField('Album'))
songs = db.ListField(db.ReferenceField('Song'))
def __unicode__(self):
return self.name
class Album(db.Document):
"""Schema for albums"""
title = db.StringField(max_length=255, required=True, unique=True)
artist = db.ReferenceField(Artist)
songs = db.ListField(db.ReferenceField('Song'))
def __unicode__(self):
return self.title
class Song(db.Document):
"""Schema for songs"""
title = db.StringField(max_length=255, required=True, unique=True)
artist = db.ReferenceField(Artist)
album = db.ReferenceField(Album)
path = db.StringField(max_length=255, required=True)
def __unicode__(self):
return self.title
以及要保存到数据库的代码:
for root, dirs, files in os.walk(dir):
for f in files:
if '.mp3' in f:
id3 = eyed3.load(os.path.join(root, f))
song = Song(title=id3.tag.title, path=os.path.join(root, f))
album = Album(title=id3.tag.album)
artist = Artist(name=id3.tag.artist)
song.save()
album.save()
artist.save()
Artist.objects(id=artist.id).update(add_to_set__albums=album, add_to_set__songs=song)
Album.objects(id=album.id).update(artist=artist, add_to_set__songs=song)
Song.objects(id=song.id).update(artist=artist, album=album)
保存后,add_to_set只是将一个对象保存到每个 ListField,而不是将其推到最后。
我很难弄清楚如何正确地做到这一点。任何帮助,将不胜感激。谢谢
好的,我找到了罪魁祸首。因为模式的某些属性是唯一的,所以当我将一个对象分配给一个已经插入到数据库中的变量时:
artist = Artist(name=id3.artist)
它 returns 一个重复的错误。然后我尝试使用该变量推送到另一个对象:
Album.objects(title=id3.album).update(artist=artist)
但由于重复错误,该变量未设置。
这是我使用更新插入重构的代码:
Song.objects(title=song.tag.title).update(path=path, upsert=True)
so = Song.objects.get(title=song.tag.title)
Album.objects(title=song.tag.album).update(add_to_set__songs=so, upsert=True)
al = Album.objects.get(title=song.tag.album)
Artist.objects(name=song.tag.artist).update(add_to_set__songs=so, add_to_set__albums=al, upsert=True)
ar = Artist.objects.get(name=song.tag.artist)
so.update(artist=ar, album=al)
al.update(artist=ar, add_to_set__songs=so)
我正在尝试将对 mp3 的引用保存到数据库中。我将艺术家、歌曲和专辑保存到它们各自的模式中,并通过 ReferenceFields 在它们之间进行引用。
我正在使用 eyeD3 解析 id3 数据(如果有)并将其保存到数据库中。我的问题是我想同时保存所有三种模式类型,但我可能会以错误的方式进行处理。我正在使用 python 2.7.10.
示例模式:
class Artist(db.Document):
"""Schema for Artist"""
name = db.StringField(max_length=255, required=True, unique=True)
albums = db.ListField(db.ReferenceField('Album'))
songs = db.ListField(db.ReferenceField('Song'))
def __unicode__(self):
return self.name
class Album(db.Document):
"""Schema for albums"""
title = db.StringField(max_length=255, required=True, unique=True)
artist = db.ReferenceField(Artist)
songs = db.ListField(db.ReferenceField('Song'))
def __unicode__(self):
return self.title
class Song(db.Document):
"""Schema for songs"""
title = db.StringField(max_length=255, required=True, unique=True)
artist = db.ReferenceField(Artist)
album = db.ReferenceField(Album)
path = db.StringField(max_length=255, required=True)
def __unicode__(self):
return self.title
以及要保存到数据库的代码:
for root, dirs, files in os.walk(dir):
for f in files:
if '.mp3' in f:
id3 = eyed3.load(os.path.join(root, f))
song = Song(title=id3.tag.title, path=os.path.join(root, f))
album = Album(title=id3.tag.album)
artist = Artist(name=id3.tag.artist)
song.save()
album.save()
artist.save()
Artist.objects(id=artist.id).update(add_to_set__albums=album, add_to_set__songs=song)
Album.objects(id=album.id).update(artist=artist, add_to_set__songs=song)
Song.objects(id=song.id).update(artist=artist, album=album)
保存后,add_to_set只是将一个对象保存到每个 ListField,而不是将其推到最后。
我很难弄清楚如何正确地做到这一点。任何帮助,将不胜感激。谢谢
好的,我找到了罪魁祸首。因为模式的某些属性是唯一的,所以当我将一个对象分配给一个已经插入到数据库中的变量时:
artist = Artist(name=id3.artist)
它 returns 一个重复的错误。然后我尝试使用该变量推送到另一个对象:
Album.objects(title=id3.album).update(artist=artist)
但由于重复错误,该变量未设置。
这是我使用更新插入重构的代码:
Song.objects(title=song.tag.title).update(path=path, upsert=True)
so = Song.objects.get(title=song.tag.title)
Album.objects(title=song.tag.album).update(add_to_set__songs=so, upsert=True)
al = Album.objects.get(title=song.tag.album)
Artist.objects(name=song.tag.artist).update(add_to_set__songs=so, add_to_set__albums=al, upsert=True)
ar = Artist.objects.get(name=song.tag.artist)
so.update(artist=ar, album=al)
al.update(artist=ar, add_to_set__songs=so)