Mongoengine - 选择错误

时间:2013-11-24 18:01:12

标签: python json mongodb flask mongoengine

我正在制作一个使用Mongoengine(MongoDB)和Flask的API。

我有问题。我有一个mongodb集合 - schema:

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']

我可以用wordlid用url api / users / xxx / words /显示单词 当我删除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
            }
        ]
    }
]

问题是当我去url api / users / xxx / words / 6时 它不起作用。

此网址的代码是

@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')

如果我在中间删除一些单词,它就不起作用。

1 个答案:

答案 0 :(得分: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')