default=CurrentUserDefault and read_only=True in DRF 3.4.0 broken if unique_together is being used in a Model for a ModelSerializer · Issue #4294 · encode/django-rest-framework (original) (raw)

Checklist

Steps to reproduce

import django django.setup() from django.contrib.auth import get_user_model from django.db import models from django.conf import settings from rest_framework import serializers, test

class Item(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) item_number = models.IntegerField()

class Meta:
   unique_together = (('user', 'item_number'),)

class ItemSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) class Meta: model = Item fields = ('id', 'item_number', 'user')

User = get_user_model() user = User.objects.create_user(username='asdf') request = test.APIRequestFactory().post('/') request.user = user

item = Item.objects.create(user=user, item_number=3)

data = {'item_number': item.item_number}

context = {'request': request}

serializer = ItemSerializer(data=data, context=context)

assert not serializer.is_valid(), 'Should be False!'

Expected behavior

The serializer should not be valid. This is the case using djangorestframework == 3.3.0

Actual behavior

The serializer is valid. This is the case using djangorestframework == 3.4.0

I've tracked the root of the issue and it seems to be pull request #4192, where a new condition is added to get_unique_together_validators(): "and not field.read_only"