Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
0e830634
Commit
0e830634
authored
Mar 22, 2016
by
Xavier Ordoquy
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3936 from carltongibson/null-uuid-fk-take2
Fix None UUID ForeignKey serialization
parents
85e57afc
2ef74cfa
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
48 additions
and
4 deletions
+48
-4
docs/topics/release-notes.md
+1
-0
rest_framework/serializers.py
+7
-3
tests/models.py
+15
-0
tests/test_relations_pk.py
+25
-1
No files found.
docs/topics/release-notes.md
View file @
0e830634
...
...
@@ -45,6 +45,7 @@ You can determine your currently installed version using `pip freeze`:
*
*Unreleased
**
*
Dropped support for EOL Django 1.7 ([#3933][gh3933])
*
Fixed
null
foreign keys targeting UUIDField primary keys. ([#3936][gh3936])
### 3.3.2
...
...
rest_framework/serializers.py
View file @
0e830634
...
...
@@ -464,9 +464,13 @@ class Serializer(BaseSerializer):
except
SkipField
:
continue
if
attribute
is
None
:
# We skip `to_representation` for `None` values so that
# fields do not have to explicitly deal with that case.
# We skip `to_representation` for `None` values so that fields do
# not have to explicitly deal with that case.
#
# For related fields with `use_pk_only_optimization` we need to
# resolve the pk value.
check_for_none
=
attribute
.
pk
if
isinstance
(
attribute
,
PKOnlyObject
)
else
attribute
if
check_for_none
is
None
:
ret
[
field
.
field_name
]
=
None
else
:
ret
[
field
.
field_name
]
=
field
.
to_representation
(
attribute
)
...
...
tests/models.py
View file @
0e830634
from
__future__
import
unicode_literals
import
uuid
from
django.db
import
models
from
django.utils.translation
import
ugettext_lazy
as
_
...
...
@@ -46,6 +48,11 @@ class ForeignKeyTarget(RESTFrameworkModel):
name
=
models
.
CharField
(
max_length
=
100
)
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
)
target
=
models
.
ForeignKey
(
ForeignKeyTarget
,
related_name
=
'sources'
,
...
...
@@ -62,6 +69,14 @@ class NullableForeignKeySource(RESTFrameworkModel):
on_delete
=
models
.
CASCADE
)
class
NullableUUIDForeignKeySource
(
RESTFrameworkModel
):
name
=
models
.
CharField
(
max_length
=
100
)
target
=
models
.
ForeignKey
(
ForeignKeyTarget
,
null
=
True
,
blank
=
True
,
related_name
=
'nullable_sources'
,
verbose_name
=
'Optional target object'
,
on_delete
=
models
.
CASCADE
)
# OneToOne
class
OneToOneTarget
(
RESTFrameworkModel
):
name
=
models
.
CharField
(
max_length
=
100
)
...
...
tests/test_relations_pk.py
View file @
0e830634
...
...
@@ -6,7 +6,8 @@ from django.utils import six
from
rest_framework
import
serializers
from
tests.models
import
(
ForeignKeySource
,
ForeignKeyTarget
,
ManyToManySource
,
ManyToManyTarget
,
NullableForeignKeySource
,
NullableOneToOneSource
,
OneToOneTarget
NullableForeignKeySource
,
NullableOneToOneSource
,
NullableUUIDForeignKeySource
,
OneToOneTarget
,
UUIDForeignKeyTarget
)
...
...
@@ -43,6 +44,18 @@ class NullableForeignKeySourceSerializer(serializers.ModelSerializer):
fields
=
(
'id'
,
'name'
,
'target'
)
# 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 +445,17 @@ class PKNullableForeignKeyTests(TestCase):
]
self
.
assertEqual
(
serializer
.
data
,
expected
)
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
)
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
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment