mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 12:30:11 +03:00
Merge 34d2f7c529
into d8da6bb29b
This commit is contained in:
commit
eb9f94fc9b
|
@ -909,8 +909,14 @@ class ModelSerializer(Serializer):
|
||||||
info = model_meta.get_field_info(ModelClass)
|
info = model_meta.get_field_info(ModelClass)
|
||||||
many_to_many = {}
|
many_to_many = {}
|
||||||
for field_name, relation_info in info.relations.items():
|
for field_name, relation_info in info.relations.items():
|
||||||
if relation_info.to_many and (field_name in validated_data):
|
if field_name in validated_data:
|
||||||
many_to_many[field_name] = validated_data.pop(field_name)
|
if relation_info.to_many:
|
||||||
|
many_to_many[field_name] = validated_data.pop(field_name)
|
||||||
|
elif not isinstance(
|
||||||
|
validated_data[field_name],
|
||||||
|
relation_info.related_model):
|
||||||
|
validated_data[relation_info.model_field.attname] = \
|
||||||
|
validated_data.pop(field_name)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
instance = ModelClass.objects.create(**validated_data)
|
instance = ModelClass.objects.create(**validated_data)
|
||||||
|
@ -1370,7 +1376,7 @@ class ModelSerializer(Serializer):
|
||||||
elif getattr(unique_constraint_field, 'auto_now', None):
|
elif getattr(unique_constraint_field, 'auto_now', None):
|
||||||
default = timezone.now
|
default = timezone.now
|
||||||
elif unique_constraint_field.has_default():
|
elif unique_constraint_field.has_default():
|
||||||
default = unique_constraint_field.default
|
default = unique_constraint_field.get_default()
|
||||||
else:
|
else:
|
||||||
default = empty
|
default = empty
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,19 @@ class ForeignKeySource(RESTFrameworkModel):
|
||||||
on_delete=models.CASCADE)
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
|
class ForeignKeyInUniquenessConstraintSource(RESTFrameworkModel):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
target = models.ForeignKey(ForeignKeyTarget,
|
||||||
|
related_name='sources_with_uniqueness',
|
||||||
|
help_text='Target',
|
||||||
|
verbose_name='Target',
|
||||||
|
default=1,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('name', 'target')
|
||||||
|
|
||||||
|
|
||||||
# Nullable ForeignKey
|
# Nullable ForeignKey
|
||||||
class NullableForeignKeySource(RESTFrameworkModel):
|
class NullableForeignKeySource(RESTFrameworkModel):
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
|
|
|
@ -5,8 +5,9 @@ from django.utils import six
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from tests.models import (
|
from tests.models import (
|
||||||
ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget,
|
ForeignKeyInUniquenessConstraintSource, ForeignKeySource, ForeignKeyTarget,
|
||||||
NullableForeignKeySource, NullableOneToOneSource, NullableUUIDForeignKeySource,
|
ManyToManySource, ManyToManyTarget, NullableForeignKeySource,
|
||||||
|
NullableOneToOneSource, NullableUUIDForeignKeySource,
|
||||||
OneToOnePKSource, OneToOneTarget, UUIDForeignKeyTarget
|
OneToOnePKSource, OneToOneTarget, UUIDForeignKeyTarget
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -37,6 +38,12 @@ class ForeignKeySourceSerializer(serializers.ModelSerializer):
|
||||||
fields = ('id', 'name', 'target')
|
fields = ('id', 'name', 'target')
|
||||||
|
|
||||||
|
|
||||||
|
class ForeignKeyUniquenessSourceSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ForeignKeyInUniquenessConstraintSource
|
||||||
|
fields = ('id', 'name', 'target')
|
||||||
|
|
||||||
|
|
||||||
# Nullable ForeignKey
|
# Nullable ForeignKey
|
||||||
class NullableForeignKeySourceSerializer(serializers.ModelSerializer):
|
class NullableForeignKeySourceSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -360,6 +367,35 @@ class PKForeignKeyTests(TestCase):
|
||||||
assert 'target' not in serializer.validated_data
|
assert 'target' not in serializer.validated_data
|
||||||
|
|
||||||
|
|
||||||
|
class PKForeignKeyInUniquenessConstraintTests(TestCase):
|
||||||
|
def test_use_default_value_for_fk(self):
|
||||||
|
default_val = ForeignKeyInUniquenessConstraintSource._meta.get_field(
|
||||||
|
'target'
|
||||||
|
).default
|
||||||
|
target = ForeignKeyTarget.objects.create(pk=default_val)
|
||||||
|
serializer = ForeignKeyUniquenessSourceSerializer(
|
||||||
|
data={'name': 'source-1'}
|
||||||
|
)
|
||||||
|
assert serializer.is_valid()
|
||||||
|
serializer.save()
|
||||||
|
source = ForeignKeyInUniquenessConstraintSource.objects.get(
|
||||||
|
name='source-1',
|
||||||
|
)
|
||||||
|
assert source.target == target
|
||||||
|
|
||||||
|
def test_provide_value_for_fk(self):
|
||||||
|
target = ForeignKeyTarget.objects.create(pk=10)
|
||||||
|
serializer = ForeignKeyUniquenessSourceSerializer(
|
||||||
|
data={'name': 'source-2', 'target': target.pk}
|
||||||
|
)
|
||||||
|
assert serializer.is_valid()
|
||||||
|
serializer.save()
|
||||||
|
source = ForeignKeyInUniquenessConstraintSource.objects.get(
|
||||||
|
name='source-2',
|
||||||
|
)
|
||||||
|
assert source.target == target
|
||||||
|
|
||||||
|
|
||||||
class PKNullableForeignKeyTests(TestCase):
|
class PKNullableForeignKeyTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
target = ForeignKeyTarget(name='target-1')
|
target = ForeignKeyTarget(name='target-1')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user