Skip to content

Commit e3f856f

Browse files
committed
Merge pull request #2975 from sheppard/read-only-nested
can't create nested serializers for unique_together relations
2 parents a0f66ff + 4a3c844 commit e3f856f

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

rest_framework/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,9 @@ def include_extra_kwargs(self, kwargs, extra_kwargs):
10881088
if extra_kwargs.get('default') and kwargs.get('required') is False:
10891089
kwargs.pop('required')
10901090

1091+
if kwargs.get('read_only', False):
1092+
extra_kwargs.pop('required', None)
1093+
10911094
kwargs.update(extra_kwargs)
10921095

10931096
return kwargs

tests/test_model_serializer.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,14 @@ class RelationalModel(models.Model):
316316
through = models.ManyToManyField(ThroughTargetModel, through=Supplementary, related_name='reverse_through')
317317

318318

319+
class UniqueTogetherModel(models.Model):
320+
foreign_key = models.ForeignKey(ForeignKeyTargetModel, related_name='unique_foreign_key')
321+
one_to_one = models.OneToOneField(OneToOneTargetModel, related_name='unique_one_to_one')
322+
323+
class Meta:
324+
unique_together = ("foreign_key", "one_to_one")
325+
326+
319327
class TestRelationalFieldMappings(TestCase):
320328
def test_pk_relations(self):
321329
class TestSerializer(serializers.ModelSerializer):
@@ -395,6 +403,32 @@ class Meta:
395403
""")
396404
self.assertEqual(unicode_repr(TestSerializer()), expected)
397405

406+
def test_nested_unique_together_relations(self):
407+
class TestSerializer(serializers.HyperlinkedModelSerializer):
408+
class Meta:
409+
model = UniqueTogetherModel
410+
depth = 1
411+
expected = dedent("""
412+
TestSerializer():
413+
url = HyperlinkedIdentityField(view_name='uniquetogethermodel-detail')
414+
foreign_key = NestedSerializer(read_only=True):
415+
url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail')
416+
name = CharField(max_length=100)
417+
one_to_one = NestedSerializer(read_only=True):
418+
url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail')
419+
name = CharField(max_length=100)
420+
class Meta:
421+
validators = [<UniqueTogetherValidator(queryset=UniqueTogetherModel.objects.all(), fields=('foreign_key', 'one_to_one'))>]
422+
""")
423+
if six.PY2:
424+
# This case is also too awkward to resolve fully across both py2
425+
# and py3. (See above)
426+
expected = expected.replace(
427+
"('foreign_key', 'one_to_one')",
428+
"(u'foreign_key', u'one_to_one')"
429+
)
430+
self.assertEqual(unicode_repr(TestSerializer()), expected)
431+
398432
def test_pk_reverse_foreign_key(self):
399433
class TestSerializer(serializers.ModelSerializer):
400434
class Meta:

0 commit comments

Comments
 (0)