mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 06:14:47 +03:00
Merge 793d03a88e
into 3693e938a4
This commit is contained in:
commit
44ae512db9
|
@ -40,6 +40,13 @@ You can determine your currently installed version using `pip freeze`:
|
|||
|
||||
## 3.3.x series
|
||||
|
||||
### 3.4
|
||||
|
||||
**Unreleased**
|
||||
|
||||
* Fixed null foreign keys targeting UUIDField primary keys. ([#3915][gh3915])
|
||||
* Dropped support for EOL Django 1.7 ([#3915][gh3915])
|
||||
|
||||
### 3.3.2
|
||||
|
||||
**Date**: [14th December 2015][3.3.2-milestone].
|
||||
|
|
|
@ -778,6 +778,8 @@ class UUIDField(Field):
|
|||
return data
|
||||
|
||||
def to_representation(self, value):
|
||||
if value is None:
|
||||
return None
|
||||
if self.uuid_format == 'hex_verbose':
|
||||
return str(value)
|
||||
else:
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import uuid
|
||||
|
||||
import django
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
@ -45,6 +48,11 @@ class ManyToManySource(RESTFrameworkModel):
|
|||
class ForeignKeyTarget(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
|
||||
if django.VERSION > (1, 7):
|
||||
class UUIDForeignKeyTarget(RESTFrameworkModel):
|
||||
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
|
||||
name = models.CharField(max_length=100)
|
||||
|
||||
|
||||
class ForeignKeySource(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
|
@ -61,6 +69,14 @@ class NullableForeignKeySource(RESTFrameworkModel):
|
|||
verbose_name='Optional target object',
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
if django.VERSION > (1, 7):
|
||||
class NullableUUIDForeignKeySource(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
target = models.ForeignKey(UUIDForeignKeyTarget, null=True, blank=True,
|
||||
related_name='nullable_sources',
|
||||
verbose_name='Optional target object',
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
|
||||
# OneToOne
|
||||
class OneToOneTarget(RESTFrameworkModel):
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import django
|
||||
import pytest
|
||||
from django.test import TestCase
|
||||
from django.utils import six
|
||||
|
||||
|
@ -9,6 +11,12 @@ from tests.models import (
|
|||
NullableForeignKeySource, NullableOneToOneSource, OneToOneTarget
|
||||
)
|
||||
|
||||
if django.VERSION > (1, 7):
|
||||
from tests.models import (
|
||||
NullableUUIDForeignKeySource,
|
||||
UUIDForeignKeyTarget
|
||||
)
|
||||
|
||||
|
||||
# ManyToMany
|
||||
class ManyToManyTargetSerializer(serializers.ModelSerializer):
|
||||
|
@ -43,6 +51,19 @@ class NullableForeignKeySourceSerializer(serializers.ModelSerializer):
|
|||
fields = ('id', 'name', 'target')
|
||||
|
||||
|
||||
if django.VERSION > (1, 7):
|
||||
# Nullable UUIDForeignKey
|
||||
class NullableUUIDForeignKeySourceSerializer(serializers.ModelSerializer):
|
||||
target = serializers.PrimaryKeyRelatedField(
|
||||
pk_field=serializers.UUIDField(),
|
||||
queryset=UUIDForeignKeyTarget.objects.all(),
|
||||
allow_null=True)
|
||||
|
||||
class Meta:
|
||||
model = NullableUUIDForeignKeySource
|
||||
fields = ('id', 'name', 'target')
|
||||
|
||||
|
||||
# Nullable OneToOne
|
||||
class NullableOneToOneTargetSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
|
@ -432,6 +453,19 @@ class PKNullableForeignKeyTests(TestCase):
|
|||
]
|
||||
self.assertEqual(serializer.data, expected)
|
||||
|
||||
@pytest.mark.skipif(django.VERSION < (1, 8), reason="UUIDField not available")
|
||||
def test_null_uuid_foreign_key_serializes_as_none(self):
|
||||
source = NullableUUIDForeignKeySource(name='Source')
|
||||
serializer = NullableUUIDForeignKeySourceSerializer(source)
|
||||
data = serializer.data
|
||||
self.assertEqual(data["target"], None)
|
||||
|
||||
@pytest.mark.skipif(django.VERSION < (1, 8), reason="UUIDField not available")
|
||||
def test_nullable_uuid_foreign_key_is_valid_when_none(self):
|
||||
data = {"name": "Source", "target": None}
|
||||
serializer = NullableUUIDForeignKeySourceSerializer(data=data)
|
||||
self.assertTrue(serializer.is_valid(), serializer.errors)
|
||||
|
||||
|
||||
class PKNullableOneToOneTests(TestCase):
|
||||
def setUp(self):
|
||||
|
|
Loading…
Reference in New Issue
Block a user