我正在制作一个使用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')
如果我在中间删除一些单词,它就不起作用。
答案 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')