Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f3dd4a1

Browse files
author
Oliver Sauder
committed
Do not skip empty one-to-one relationships
1 parent 7c60e76 commit f3dd4a1

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ any parts of the framework not mentioned in the documentation should generally b
2626
* Avoid patch on `RelationshipView` deleting relationship instance when constraint would allow null ([#242](https://github.com/django-json-api/django-rest-framework-json-api/issues/242))
2727
* Avoid error with related urls when retrieving relationship which is referenced as `ForeignKey` on parent
2828
* Do not render `write_only` relations
29+
* Do not skip empty one-to-one relationships
2930

3031

3132
## [2.6.0] - 2018年09月20日

‎example/tests/unit/test_renderers.py‎

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from rest_framework_json_api import serializers, views
44
from rest_framework_json_api.renderers import JSONRenderer
55

6-
from example.models import Comment, Entry
6+
from example.models import Author, Comment, Entry
77

88

99
# serializers
@@ -45,8 +45,8 @@ class ReadOnlyDummyTestViewSet(views.ReadOnlyModelViewSet):
4545
serializer_class = DummyTestSerializer
4646

4747

48-
def render_dummy_test_serialized_view(view_class):
49-
serializer = view_class.serializer_class(instance=Entry())
48+
def render_dummy_test_serialized_view(view_class, instance):
49+
serializer = view_class.serializer_class(instance=instance)
5050
renderer = JSONRenderer()
5151
return renderer.render(
5252
serializer.data,
@@ -58,22 +58,22 @@ def test_simple_reverse_relation_included_renderer():
5858
Test renderer when a single reverse fk relation is passed.
5959
'''
6060
rendered = render_dummy_test_serialized_view(
61-
DummyTestViewSet)
61+
DummyTestViewSet, Entry())
6262

6363
assert rendered
6464

6565

6666
def test_simple_reverse_relation_included_read_only_viewset():
6767
rendered = render_dummy_test_serialized_view(
68-
ReadOnlyDummyTestViewSet)
68+
ReadOnlyDummyTestViewSet, Entry())
6969

7070
assert rendered
7171

7272

7373
def test_render_format_field_names(settings):
7474
"""Test that json field is kept untouched."""
7575
settings.JSON_API_FORMAT_FIELD_NAMES = 'dasherize'
76-
rendered = render_dummy_test_serialized_view(DummyTestViewSet)
76+
rendered = render_dummy_test_serialized_view(DummyTestViewSet, Entry())
7777

7878
result = json.loads(rendered.decode())
7979
assert result['data']['attributes']['json-field'] == {'JsonKey': 'JsonValue'}
@@ -83,17 +83,15 @@ def test_render_format_keys(settings):
8383
"""Test that json field value keys are formated."""
8484
delattr(settings, 'JSON_API_FORMAT_FILED_NAMES')
8585
settings.JSON_API_FORMAT_KEYS = 'dasherize'
86-
rendered = render_dummy_test_serialized_view(DummyTestViewSet)
86+
rendered = render_dummy_test_serialized_view(DummyTestViewSet, Entry())
8787

8888
result = json.loads(rendered.decode())
8989
assert result['data']['attributes']['json-field'] == {'json-key': 'JsonValue'}
9090

9191

92-
def test_writeonly_not_in_response(settings):
92+
def test_writeonly_not_in_response():
9393
"""Test that writeonly fields are not shown in list response"""
9494

95-
settings.JSON_API_FORMAT_FIELD_NAMES = 'dasherize'
96-
9795
class WriteonlyTestSerializer(serializers.ModelSerializer):
9896
'''Serializer for testing the absence of write_only fields'''
9997
comments = serializers.ResourceRelatedField(
@@ -112,8 +110,27 @@ class WriteOnlyDummyTestViewSet(views.ReadOnlyModelViewSet):
112110
queryset = Entry.objects.all()
113111
serializer_class = WriteonlyTestSerializer
114112

115-
rendered = render_dummy_test_serialized_view(WriteOnlyDummyTestViewSet)
113+
rendered = render_dummy_test_serialized_view(WriteOnlyDummyTestViewSet, Entry())
116114
result = json.loads(rendered.decode())
117115

118116
assert 'rating' not in result['data']['attributes']
119117
assert 'relationships' not in result['data']
118+
119+
120+
def test_render_empty_relationship_reverse_lookup():
121+
"""Test that empty relationships are rendered as None."""
122+
123+
class EmptyRelationshipSerializer(serializers.ModelSerializer):
124+
class Meta:
125+
model = Author
126+
fields = ('bio', )
127+
128+
class EmptyRelationshipViewSet(views.ReadOnlyModelViewSet):
129+
queryset = Author.objects.all()
130+
serializer_class = EmptyRelationshipSerializer
131+
132+
rendered = render_dummy_test_serialized_view(EmptyRelationshipViewSet, Author())
133+
result = json.loads(rendered.decode())
134+
assert 'relationships' in result['data']
135+
assert 'bio' in result['data']['relationships']
136+
assert result['data']['relationships']['bio'] == {'data': None}

‎rest_framework_json_api/renderers.py‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,6 @@ def extract_relationships(cls, fields, resource, resource_instance):
150150
data.update({field_name: relation_data})
151151

152152
if isinstance(field, (ResourceRelatedField, )):
153-
relation_instance_id = getattr(resource_instance, source + "_id", None)
154-
if not relation_instance_id:
155-
resolved, relation_instance = utils.get_relation_instance(resource_instance,
156-
source, field.parent)
157-
if not resolved:
158-
continue
159-
160153
if not isinstance(field, SkipDataMixin):
161154
relation_data.update({'data': resource.get(field_name)})
162155

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /