Skip to content
This repository was archived by the owner on Jun 6, 2024. It is now read-only.
This repository was archived by the owner on Jun 6, 2024. It is now read-only.

How do I get many rows with links? #425

Description

@NAN-CForadas

Help!

burned many hours and brain cells trying to figure this out...  I have an 'id' key in my data. 

Code

import datetime
import pprint
from marshmallow_jsonapi import Schema, fields
from marshmallow import post_dump


data = [{'id': 1,
         'created_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595964),
         'updated_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595965),
         'description': 'NAN63831511',
         'review_status_type': 1,
         'user': 1,
         'version': 1},
        {'id': 4,
         'created_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595964),
         'updated_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595965),
         'description': 'NAN73623423',
         'review_status_type': 1,
         'user': 3,
         'version': 2},
        {'id': 5,
         'created_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595964),
         'updated_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595965),
         'description': 'NAN93623423',
         'review_status_type': 1,
         'user': 5,
         'version': 2},
        {'id': 2,
         'created_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595964),
         'updated_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595965),
         'description': 'NAN63831511',
         'review_status_type': 1,
         'user': 1,
         'version': 2},
        {'id': 3,
         'created_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595964),
         'updated_at': datetime.datetime(2022, 6, 29, 19, 16, 18, 595965),
         'description': 'NAN63838745',
         'review_status_type': 1,
         'user': 1,
         'version': 2}]

url_ = 'http://127.0.0.1/review/{id}'
many_url_ = 'http://127.0.0.1/reviews/{id}'


class ReviewSchema(Schema):
    id = fields.Integer(dump_only=True)
    created_at = fields.DateTime(format="iso")
    updated_at = fields.DateTime(format="iso")
    description = fields.String()
    review_status_type_id = fields.Integer()
    user_id = fields.Integer()
    version = fields.Integer()

    class Meta:
        many = True
        type_ = "reviews"  # required!
        self_view = "review_detail"
        self_view_kwargs = {"id": "<id>"}
        self_view_many = "reviews_list"
        self_url_kwargs = {'id': "<id>"}
        self_url = url_
        self_url_many = many_url_

    @post_dump
    def fix_datetimes(self, data, **kwargs):
        # print(f"@post_dump data = {data}")
        data['created_at'] += 'Z'
        data['updated_at'] += 'Z'
        return data


# dump single row
print(f"\n{25*'*'} ONE ROW {25*'*'}\n")
resp = ReviewSchema().dump(data[2])
pprint.pprint(resp)
print(f"\n{25*'*'} ONE ROW {25*'*'}\n")

# dump rows
print(f"\n{25*'*'} MANY ROWS {25*'*'}\n")
resp = ReviewSchema(many=True).dump(data)
pprint.pprint(resp)
print(f"\n{25*'*'} MANY ROWS {25*'*'}\n")

Output


************************* ONE ROW *************************

{'data': {'attributes': {'created_at': '2022-06-29T19:16:18.595964Z',
                         'description': 'NAN93623423',
                         'updated_at': '2022-06-29T19:16:18.595965Z',
                         'version': 2},
          'id': 5,
          'links': {'self': 'http://127.0.0.1/review/5'},
          'type': 'reviews'},
 'links': {'self': 'http://127.0.0.1/review/5'}}

************************* ONE ROW *************************


************************* MANY ROWS *************************

Traceback (most recent call last):
  File "/Users/user/PycharmProjects/pee-wee-testing/many_rows.py", line 83, in <module>
    resp = ReviewSchema(many=True).dump(data)
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow/schema.py", line 560, in dump
    result = self._invoke_dump_processors(
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow/schema.py", line 1071, in _invoke_dump_processors
    data = self._invoke_processors(
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow/schema.py", line 1225, in _invoke_processors
    data = processor(data, many=many, **kwargs)
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow_jsonapi/schema.py", line 128, in format_json_api_response
    ret = self.wrap_response(ret, many)
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow_jsonapi/schema.py", line 415, in wrap_response
    top_level_links = self.get_top_level_links(data, many)
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow_jsonapi/schema.py", line 393, in get_top_level_links
    self_link = self.generate_url(self.opts.self_url_many)
  File "/Users/user/PycharmProjects/pee-wee-testing/venv/lib/python3.10/site-packages/marshmallow_jsonapi/schema.py", line 422, in generate_url
    return link.format_map(kwargs) if link else None
KeyError: 'id'

Process finished with exit code 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions