Attribute error for list of objects from collection?

We use Flask-Restful to implement the API. As a database, we use MongoDB and MongoEngine as ODM. To get MongoEngine to work with Restful, we followed this blog post . To get the correct json format, we use the built-in methods marsheling-methods . This works fine for individual objects (for example, a single element of a collection), but when crossing a list of objects (for example, all elements of a collection), an AttributeError is created (although we use the same syntax as for individual objects). This is what our model and our views look like (I don’t insert routes, because they are in a separate file and work).

Model:

class Task(db.Document):
    name = db.StringField()
    description_mini = db.StringField()

Views:

parser = reqparse.RequestParser()
parser.add_argument('task_id', type=str)

task_format = {
    "name": fields.String,
    "description_mini": fields.String
}

class TasksView(Resource):

    @marshal_with(task_format)
    def get(self):
        tasks = Task.objects().all()
        return tasks, 200


class TaskDetailView(Resource):

    @marshal_with(task_format)
    def get(self):
        args = parser.parse_args()
        startup_id = args['task_id']

        task = Task.objects(id=task_id).first()

        return task, 200

:

AttributeError

Traceback (most recent call last)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 257, in error_router
return self.handle_error(e)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 257, in error_router
return self.handle_error(e)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 397, in wrapper
resp = resource(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask/views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 487, in dispatch_request
resp = meth(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 562, in wrapper
return marshal(data, self.fields), code, headers
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 533, in marshal
return OrderedDict(items)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 52, in __init__
self.__update(*args, **kwds)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py", line 547, in update
for key, value in other:
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 532, in <genexpr>
for k, v in fields.items())
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 104, in output
value = get_value(key if self.attribute is None else self.attribute, obj)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 37, in get_value
return _get_value_for_keys(key.split('.'), obj, default)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 42, in _get_value_for_keys
return _get_value_for_key(keys[0], obj, default)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 51, in _get_value_for_key
return obj[key]
File "/project/venv/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 152, in __getitem__
raise AttributeError
AttributeError
+4
3

, .

, :

task_list_format = {
    'tasks': fields.List(fields.Nested(task_format))
}

class TasksView(Resource):

    @marshal_with(task_list_format)
    def get(self):
        tasks = Task.objects().all()
        return { 'tasks': tasks }, 200

, , Flask-RESTful, . "".

, .

+6

flask_restful.marshal_with_fields:

>>> from flask_restful import marshal_with_field, fields
>>> @marshal_with_field(fields.List(fields.Integer))
... def get():
...     return ['1', 2, 3.0]
...
>>> get()
[1, 2, 3]
0

, , , Queryset mongoengine , Flask-restful/restplus .

task_format = {
    "name": fields.String,
    "description_mini": fields.String
}

class TasksView(Resource):

    @marshal_with(task_format)
    def get(self):
        tasks = Task.objects().all()
        return list(tasks)
0

Source: https://habr.com/ru/post/1533402/


All Articles