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
4eb5861f
Commit
4eb5861f
authored
Jan 18, 2013
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Starting migration from ManyField to Field(many=True)
parent
4b61ead5
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
49 deletions
+46
-49
rest_framework/relations.py
+43
-48
rest_framework/tests/serializer.py
+3
-1
No files found.
rest_framework/relations.py
View file @
4eb5861f
...
@@ -21,15 +21,20 @@ class RelatedField(WritableField):
...
@@ -21,15 +21,20 @@ class RelatedField(WritableField):
representation of the target.
representation of the target.
"""
"""
widget
=
widgets
.
Select
widget
=
widgets
.
Select
many_widget
=
widgets
.
SelectMultiple
cache_choices
=
False
cache_choices
=
False
empty_label
=
None
empty_label
=
None
default_read_only
=
True
# TODO: Remove this
default_read_only
=
True
# TODO: Remove this
many
=
False
def
__init__
(
self
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
self
.
queryset
=
kwargs
.
pop
(
'queryset'
,
None
)
self
.
queryset
=
kwargs
.
pop
(
'queryset'
,
None
)
self
.
null
=
kwargs
.
pop
(
'null'
,
False
)
self
.
null
=
kwargs
.
pop
(
'null'
,
False
)
self
.
many
=
kwargs
.
pop
(
'many'
,
self
.
many
)
super
(
RelatedField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
super
(
RelatedField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
self
.
read_only
=
kwargs
.
pop
(
'read_only'
,
self
.
default_read_only
)
self
.
read_only
=
kwargs
.
pop
(
'read_only'
,
self
.
default_read_only
)
if
self
.
many
:
self
.
widget
=
self
.
many_widget
def
initialize
(
self
,
parent
,
field_name
):
def
initialize
(
self
,
parent
,
field_name
):
super
(
RelatedField
,
self
)
.
initialize
(
parent
,
field_name
)
super
(
RelatedField
,
self
)
.
initialize
(
parent
,
field_name
)
...
@@ -108,6 +113,9 @@ class RelatedField(WritableField):
...
@@ -108,6 +113,9 @@ class RelatedField(WritableField):
if
value
is
None
:
if
value
is
None
:
return
None
return
None
if
self
.
many
:
return
[
self
.
to_native
(
item
)
for
item
in
value
.
all
()]
return
self
.
to_native
(
value
)
return
self
.
to_native
(
value
)
def
field_from_native
(
self
,
data
,
files
,
field_name
,
into
):
def
field_from_native
(
self
,
data
,
files
,
field_name
,
into
):
...
@@ -115,6 +123,16 @@ class RelatedField(WritableField):
...
@@ -115,6 +123,16 @@ class RelatedField(WritableField):
return
return
try
:
try
:
if
self
.
many
:
try
:
# Form data
value
=
data
.
getlist
(
field_name
)
if
value
==
[
''
]:
value
=
[]
except
AttributeError
:
# Non-form data
value
=
data
[
field_name
]
else
:
value
=
data
[
field_name
]
value
=
data
[
field_name
]
except
KeyError
:
except
KeyError
:
if
self
.
required
:
if
self
.
required
:
...
@@ -125,47 +143,12 @@ class RelatedField(WritableField):
...
@@ -125,47 +143,12 @@ class RelatedField(WritableField):
raise
ValidationError
(
'Value may not be null'
)
raise
ValidationError
(
'Value may not be null'
)
elif
value
in
(
None
,
''
)
and
self
.
null
:
elif
value
in
(
None
,
''
)
and
self
.
null
:
into
[(
self
.
source
or
field_name
)]
=
None
into
[(
self
.
source
or
field_name
)]
=
None
elif
self
.
many
:
into
[(
self
.
source
or
field_name
)]
=
[
self
.
from_native
(
item
)
for
item
in
value
]
else
:
else
:
into
[(
self
.
source
or
field_name
)]
=
self
.
from_native
(
value
)
into
[(
self
.
source
or
field_name
)]
=
self
.
from_native
(
value
)
class
ManyRelatedMixin
(
object
):
"""
Mixin to convert a related field to a many related field.
"""
widget
=
widgets
.
SelectMultiple
def
field_to_native
(
self
,
obj
,
field_name
):
value
=
getattr
(
obj
,
self
.
source
or
field_name
)
return
[
self
.
to_native
(
item
)
for
item
in
value
.
all
()]
def
field_from_native
(
self
,
data
,
files
,
field_name
,
into
):
if
self
.
read_only
:
return
try
:
# Form data
value
=
data
.
getlist
(
self
.
source
or
field_name
)
except
:
# Non-form data
value
=
data
.
get
(
self
.
source
or
field_name
)
else
:
if
value
==
[
''
]:
value
=
[]
into
[
field_name
]
=
[
self
.
from_native
(
item
)
for
item
in
value
]
class
ManyRelatedField
(
ManyRelatedMixin
,
RelatedField
):
"""
Base class for related model managers.
If not overridden, this represents a to-many relationship, using the unicode
representations of the target, and is read-only.
"""
pass
### PrimaryKey relationships
### PrimaryKey relationships
class
PrimaryKeyRelatedField
(
RelatedField
):
class
PrimaryKeyRelatedField
(
RelatedField
):
...
@@ -227,6 +210,12 @@ class PrimaryKeyRelatedField(RelatedField):
...
@@ -227,6 +210,12 @@ class PrimaryKeyRelatedField(RelatedField):
return
self
.
to_native
(
pk
)
return
self
.
to_native
(
pk
)
class
ManyRelatedField
(
RelatedField
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
kwargs
[
'many'
]
=
True
super
(
ManyRelatedField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
class
ManyPrimaryKeyRelatedField
(
ManyRelatedField
):
class
ManyPrimaryKeyRelatedField
(
ManyRelatedField
):
"""
"""
Represents a to-many relationship as a pk value.
Represents a to-many relationship as a pk value.
...
@@ -314,10 +303,6 @@ class SlugRelatedField(RelatedField):
...
@@ -314,10 +303,6 @@ class SlugRelatedField(RelatedField):
raise
ValidationError
(
msg
)
raise
ValidationError
(
msg
)
class
ManySlugRelatedField
(
ManyRelatedMixin
,
SlugRelatedField
):
form_field_class
=
forms
.
MultipleChoiceField
### Hyperlinked relationships
### Hyperlinked relationships
class
HyperlinkedRelatedField
(
RelatedField
):
class
HyperlinkedRelatedField
(
RelatedField
):
...
@@ -442,13 +427,6 @@ class HyperlinkedRelatedField(RelatedField):
...
@@ -442,13 +427,6 @@ class HyperlinkedRelatedField(RelatedField):
return
obj
return
obj
class
ManyHyperlinkedRelatedField
(
ManyRelatedMixin
,
HyperlinkedRelatedField
):
"""
Represents a to-many relationship, using hyperlinking.
"""
form_field_class
=
forms
.
MultipleChoiceField
class
HyperlinkedIdentityField
(
Field
):
class
HyperlinkedIdentityField
(
Field
):
"""
"""
Represents the instance, or a property on the instance, using hyperlinking.
Represents the instance, or a property on the instance, using hyperlinking.
...
@@ -512,3 +490,20 @@ class HyperlinkedIdentityField(Field):
...
@@ -512,3 +490,20 @@ class HyperlinkedIdentityField(Field):
pass
pass
raise
Exception
(
'Could not resolve URL for field using view name "
%
s"'
%
view_name
)
raise
Exception
(
'Could not resolve URL for field using view name "
%
s"'
%
view_name
)
### Old-style many classes for backwards compat
class
ManySlugRelatedField
(
SlugRelatedField
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
kwargs
[
'many'
]
=
True
super
(
ManySlugRelatedField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
class
ManyHyperlinkedRelatedField
(
HyperlinkedRelatedField
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
kwargs
[
'many'
]
=
True
super
(
ManyHyperlinkedRelatedField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
rest_framework/tests/serializer.py
View file @
4eb5861f
import
datetime
import
datetime
import
pickle
import
pickle
from
django.utils.datastructures
import
MultiValueDict
from
django.test
import
TestCase
from
django.test
import
TestCase
from
rest_framework
import
serializers
from
rest_framework
import
serializers
from
rest_framework.tests.models
import
(
HasPositiveIntegerAsChoice
,
Album
,
ActionItem
,
Anchor
,
BasicModel
,
from
rest_framework.tests.models
import
(
HasPositiveIntegerAsChoice
,
Album
,
ActionItem
,
Anchor
,
BasicModel
,
...
@@ -479,7 +480,8 @@ class ManyToManyTests(TestCase):
...
@@ -479,7 +480,8 @@ class ManyToManyTests(TestCase):
containing no items, using a representation that does not support
containing no items, using a representation that does not support
lists (eg form data).
lists (eg form data).
"""
"""
data
=
{
'rel'
:
''
}
data
=
MultiValueDict
()
data
.
setlist
(
'rel'
,
[
''
])
serializer
=
self
.
serializer_class
(
data
=
data
)
serializer
=
self
.
serializer_class
(
data
=
data
)
self
.
assertEquals
(
serializer
.
is_valid
(),
True
)
self
.
assertEquals
(
serializer
.
is_valid
(),
True
)
instance
=
serializer
.
save
()
instance
=
serializer
.
save
()
...
...
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