|
1 | 1 | """ |
2 | 2 | Renderers |
3 | 3 | """ |
| 4 | +from collections import OrderedDict |
4 | 5 | from rest_framework import renderers |
5 | 6 |
|
6 | 7 | from . import utils |
| 8 | +from rest_framework.relations import RelatedField |
| 9 | +from rest_framework.settings import api_settings |
7 | 10 |
|
8 | 11 |
|
9 | 12 | class JSONRenderer(renderers.JSONRenderer): |
@@ -53,15 +56,26 @@ def render(self, data, accepted_media_type=None, renderer_context=None): |
53 | 56 | # Check for paginated results |
54 | 57 | results = (data["results"] if isinstance(data, dict) else data) |
55 | 58 |
|
| 59 | + resource_serializer = results.serializer |
| 60 | + |
| 61 | + # Get the serializer fields |
| 62 | + if hasattr(resource_serializer, 'child'): |
| 63 | + fields = getattr(resource_serializer.child, 'fields') |
| 64 | + else: |
| 65 | + fields = getattr(resource_serializer, 'fields') |
| 66 | + |
56 | 67 | json_api_data = [] |
57 | | - for result in results: |
58 | | - result_id = result.pop('id', None) |
59 | | - json_api_data.append({ |
60 | | - 'type': resource_name, |
61 | | - 'id': result_id, |
62 | | - 'attributes': utils.format_keys(result), |
63 | | - 'meta': utils.convert_resource(result, results, request) |
64 | | - }) |
| 68 | + for resource in results: |
| 69 | + resource_data = [ |
| 70 | + ('type', resource_name), |
| 71 | + ('id', utils.extract_id(fields, resource)), |
| 72 | + ('attributes', utils.format_keys(utils.extract_attributes(fields, resource))) |
| 73 | + ] |
| 74 | + # Add 'self' link if field is present and valid |
| 75 | + if api_settings.URL_FIELD_NAME in resource and \ |
| 76 | + isinstance(fields[api_settings.URL_FIELD_NAME], RelatedField): |
| 77 | + resource_data.append(('links', {'self': resource[api_settings.URL_FIELD_NAME]})) |
| 78 | + json_api_data.append(OrderedDict(resource_data)) |
65 | 79 | else: |
66 | 80 | result_id = data.pop('id', None) |
67 | 81 | json_api_data = { |
|
0 commit comments