Skip to content

Commit 1e2d7d9

Browse files
committed
Merge pull request #187 from ZEROFAIL/bugfix/implicit_fields2
Fix crash related to Meta.fields / Meta.exlcude
2 parents 7699b98 + bb137f5 commit 1e2d7d9

File tree

3 files changed

+45
-9
lines changed

3 files changed

+45
-9
lines changed

example/serializers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ class CommentSerializer(serializers.ModelSerializer):
7676

7777
class Meta:
7878
model = Comment
79-
fields = ('entry', 'body', 'author',)
79+
exclude = ('created_at', 'modified_at',)
80+
# fields = ('entry', 'body', 'author',)

example/tests/test_serializers.py

+41
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.core.urlresolvers import reverse
12
from django.test import TestCase
23
from django.utils import timezone
34

@@ -6,6 +7,11 @@
67

78
from example.models import Blog, Entry, Author
89

10+
import pytest
11+
from example.tests.utils import dump_json, redump_json
12+
13+
pytestmark = pytest.mark.django_db
14+
915

1016
class TestResourceIdentifierObjectSerializer(TestCase):
1117
def setUp(self):
@@ -71,3 +77,38 @@ def test_deserialize_many(self):
7177

7278
print(serializer.data)
7379

80+
81+
class TestModelSerializer(object):
82+
def test_model_serializer_with_implicit_fields(self, comment, client):
83+
expected = {
84+
"data": {
85+
"type": "comments",
86+
"id": str(comment.pk),
87+
"attributes": {
88+
"body": comment.body
89+
},
90+
"relationships": {
91+
"entry": {
92+
"data": {
93+
"type": "entries",
94+
"id": str(comment.entry.pk)
95+
}
96+
},
97+
"author": {
98+
"data": {
99+
"type": "authors",
100+
"id": str(comment.author.pk)
101+
}
102+
},
103+
}
104+
}
105+
}
106+
107+
response = client.get(reverse("comment-detail", kwargs={'pk': comment.pk}))
108+
109+
assert response.status_code == 200
110+
111+
actual = redump_json(response.content)
112+
expected_json = dump_json(expected)
113+
114+
assert actual == expected_json

rest_framework_json_api/serializers.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,6 @@ class ModelSerializer(IncludedResourcesValidationMixin, SparseFieldsetsMixin, Mo
137137
"""
138138
serializer_related_field = ResourceRelatedField
139139

140-
def __init__(self, *args, **kwargs):
141-
meta_fields = getattr(self.Meta, 'meta_fields', [])
142-
# we add meta_fields to fields so they will be serialized like usual
143-
self.Meta.fields = tuple(tuple(self.Meta.fields) + tuple(meta_fields))
144-
super(ModelSerializer, self).__init__(*args, **kwargs)
145-
146140
def get_field_names(self, declared_fields, info):
147141
"""
148142
We override the parent to omit explicity defined meta fields (such
@@ -155,5 +149,5 @@ def get_field_names(self, declared_fields, info):
155149
field = declared_fields[field_name]
156150
if field_name not in meta_fields:
157151
declared[field_name] = field
158-
return super(ModelSerializer, self).get_field_names(declared, info)
159-
152+
fields = super(ModelSerializer, self).get_field_names(declared, info)
153+
return list(fields) + list(getattr(self.Meta, 'meta_fields', list()))

0 commit comments

Comments
 (0)