2015-10-05 161 views
0

我試圖保存對數據庫的MP3引用。我將藝術家,歌曲和專輯保存到各自的模式中,並通過ReferenceFields在它們之間引用。Mongoengine和add_to_set似乎沒有工作

我使用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 

以及碼保存到DB:

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代替推到端。

我很難搞清楚如何正確地做到這一點。任何幫助,將不勝感激。謝謝

回答

0

好吧,所以我找到了罪魁禍首。由於架構的一些屬性是獨特的,當我分配一個對象到已經插入到數據庫變量:

artist = Artist(name=id3.artist) 

它返回一個dulpicate錯誤。然後,我嘗試使用該變量推到另一個對象:

Album.objects(title=id3.album).update(artist=artist) 

但變量未設置由於重複的錯誤。

這裏使用upserts我重構的代碼:

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)