0

I am trying to return a list of all keywords from a database that looks something like

  [
    'foo',
    'bar',
    'baz',
  ]

Model

class Keyword(db.Model, SurrogatePK):
    __tablename__ = 'keywords'
    keyword = Column(db.Text, nullable=False, unique=True)

    def __repr__(self):
        """Represent instance as a unique string."""
        return '<Keyword({keyword})>'.format(keyword=self.keyword)

Schema

class KeywordSchema(ma.ModelSchema):
    class Meta:
        model = Keyword

Then ,

keywords_schema = KeywordSchema(many=True, only='keyword')

Route

class Keywords(Resource):
    def get(self):
        '''Head to http://localhost:5000/api/v1/keywords

        Returns a list of all keywords.

        '''
        keywords = Keyword.query.all()
        result = keywords_schema.dump(keywords)
        return jsonify({'keywords': result})

This is throwing an `AttributeError'

Partial Trace

File "C:\Users\ddonovan\DHG\web\flask-research\Query-Metadata\metadata\views.py", line 33, in get
    result = keywords_schema.dump(keywords)
  File "c:\users\ddonovan\.edm\envs\flask\lib\site-packages\marshmallow\schema.py", line 491, in dump
    self._update_fields(processed_obj, many=many)
  File "c:\users\ddonovan\.edm\envs\flask\lib\site-packages\marshmallow\schema.py", line 760, in _update_fields
    ret = self.__filter_fields(field_names, obj, many=many)
  File "c:\users\ddonovan\.edm\envs\flask\lib\site-packages\marshmallow\schema.py", line 834, in __filter_fields
    '"{0}" is not a valid field for {1}.'.format(key, obj))
AttributeError: "w" is not a valid field for <Keyword(numpy)>
spitfiredd
  • 2,897
  • 5
  • 32
  • 75

1 Answers1

0

My instance to KeywordSchema needs to be keywords_schema = KeywordSchema(many=True, only=['keyword'])

Then in my endpoint

class Keywords(Resource):
    def get(self):
        '''Head to http://localhost:5000/api/v1/keywords

        Returns a list of all keywords.

        Example Output:

        [
            "foo",
            "bar",
            "baz"
        ]

        '''
        keywords = Keyword.query.all()
        result = keywords_schema.dump(keywords)
        return jsonify([d['keyword'] for d in result.data])
spitfiredd
  • 2,897
  • 5
  • 32
  • 75