2013-11-24 72 views
0

我正在製作一個使用Mongoengine(MongoDB)和Flask的API。Mongoengine - 選擇錯誤

我有一個問題。我有一個MongoDB的集合 - 模式:

class Word(EmbeddedDocument): 
    word_id = IntField() 
    word = StringField() 
    translation = StringField() 
    strength = IntField() 
    meta = {'collection': 'users'} 

    def to_dict(self): 
     return mongo_to_dict(self) 

class User(Document): 
    user_id = IntField() 
    username = StringField() 
    email = EmailField() 
    password = StringField() 
    words = ListField(EmbeddedDocumentField(Word)) 
    meta = {'collection': 'users', 
    'ordering': ['-user_id'] 

我可以顯示文字與URL API /用戶/ XXX /詞word_id/ 當我刪除字id爲5,和收藏看起來像這樣

[ 
    { 
     "username": "xxx", 
     "password": "yyy", 
     "words": [ 
      { 
       "translation": "ajlkjbc", 
       "strength": 1, 
       "word": "abjlkc", 
       "word_id": 1 
      }, 
      { 
       "translation": "ajlkjbc", 
       "strength": 1, 
       "word": "ahkjc", 
       "word_id": 2 
      }, 
      { 
       "translation": "aklbc", 
       "strength": 5, 
       "word": "jklc", 
       "word_id": 3 
      }, 
      { 
       "translation": "afdfsc", 
       "strength": 1, 
       "word": "acjj", 
       "word_id": 4 
      }, 
      { 
       "translation": "dsadf", 
       "strength": 1, 
       "word": "dvdsf", 
       "word_id": 6 
      } 
     ] 
    } 
] 

問題是,當我去的網址API /用戶/ XXX /字/ 6 它不起作用。

我給這URL編碼

@app.route('/api/users/<username>/words/<int:word_id>', methods=['GET']) 
def get_words(username): 
    user = User.objects(username=username) 
    l_user = user.to_json() 
    decoded = json.loads(l_user) 
    return Response(json.dumps(decoded[0]["words"][word_id-1], sort_keys=False, indent=4), 
       mimetype='application/json') 

,如果我在中間刪除一些詞,因爲這是行不通的。

+0

是不是word_id還是6?你必須得到價值或在列表中保持嚴格的秩序...我不認爲你可以混合兩種... –

+0

是的,這是問題所在。我想保持word_id一樣。所以當我想用word_id 4刪除單詞時,我想保留其他單詞,因爲單詞與客戶端(Backbone集合)同步。因此,當我想要例如刪除URL api/words/xxx/words/6這個已經在客戶端中的單詞時,它將不起作用,因爲它在數據庫中會有所不同。如果你的解決方案是我有100個單詞,並且我想用word_id 50刪除單詞,我必須重寫50個單詞,然後我必須再次將我的新單詞發送給客戶端,並再次在客戶端上重寫模型。我認爲這很耗時 – SamuelMatis

回答

0

一個更好的辦法是通過ID或返回404過濾掉匹配的項目,如果不存在如:

@app.route('/api/users/<username>/words/<int:word_id>', methods=['GET']) 
def get_words(username): 
    user = User.objects(username=username) 
    word = [word for word user.words if word.word_id == word_id] 
    if not word: 
     return abort(404) 
    return Response(word[0].to_json(sort_keys=False, indent=4), 
        mimetype='application/json')