mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-02 20:54:42 +03:00
Fix issues with pk related fields in the browsable API.
This commit is contained in:
parent
2dec2b9c13
commit
b9bff2a984
16
README.md
16
README.md
|
@ -57,8 +57,24 @@ To run the tests.
|
||||||
|
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2.0.2
|
||||||
|
|
||||||
|
**Date**: 2nd Nov 2012
|
||||||
|
|
||||||
|
* Fix issues with pk related fields in the browsable API.
|
||||||
|
|
||||||
|
## 2.0.1
|
||||||
|
|
||||||
|
**Date**: 1st Nov 2012
|
||||||
|
|
||||||
|
* Add support for relational fields in the browsable API.
|
||||||
|
* Added SlugRelatedField and ManySlugRelatedField.
|
||||||
|
* If PUT creates an instance return '201 Created', instead of '200 OK'.
|
||||||
|
|
||||||
## 2.0.0
|
## 2.0.0
|
||||||
|
|
||||||
|
**Date**: 30th Oct 2012
|
||||||
|
|
||||||
* Redesign of core components.
|
* Redesign of core components.
|
||||||
* Fix **all of the things**.
|
* Fix **all of the things**.
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,24 @@
|
||||||
>
|
>
|
||||||
> — Eric S. Raymond, [The Cathedral and the Bazaar][cite].
|
> — Eric S. Raymond, [The Cathedral and the Bazaar][cite].
|
||||||
|
|
||||||
|
## 2.0.2
|
||||||
|
|
||||||
|
**Date**: 2nd Nov 2012
|
||||||
|
|
||||||
|
* Fix issues with pk related fields in the browsable API.
|
||||||
|
|
||||||
## 2.0.1
|
## 2.0.1
|
||||||
|
|
||||||
|
**Date**: 1st Nov 2012
|
||||||
|
|
||||||
* Add support for relational fields in the browsable API.
|
* Add support for relational fields in the browsable API.
|
||||||
* Added SlugRelatedField and ManySlugRelatedField.
|
* Added SlugRelatedField and ManySlugRelatedField.
|
||||||
* If PUT creates an instance return '201 Created', instead of '200 OK'.
|
* If PUT creates an instance return '201 Created', instead of '200 OK'.
|
||||||
|
|
||||||
## 2.0.0
|
## 2.0.0
|
||||||
|
|
||||||
|
**Date**: 30th Oct 2012
|
||||||
|
|
||||||
* **Fix all of the things.** (Well, almost.)
|
* **Fix all of the things.** (Well, almost.)
|
||||||
* For more information please see the [2.0 migration guide][migration].
|
* For more information please see the [2.0 migration guide][migration].
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
__version__ = '2.0.1'
|
__version__ = '2.0.2'
|
||||||
|
|
||||||
VERSION = __version__ # synonym
|
VERSION = __version__ # synonym
|
||||||
|
|
|
@ -230,6 +230,7 @@ class ModelField(WritableField):
|
||||||
##### Relational fields #####
|
##### Relational fields #####
|
||||||
|
|
||||||
|
|
||||||
|
# Not actually Writable, but subclasses may need to be.
|
||||||
class RelatedField(WritableField):
|
class RelatedField(WritableField):
|
||||||
"""
|
"""
|
||||||
Base class for related model fields.
|
Base class for related model fields.
|
||||||
|
@ -240,10 +241,12 @@ class RelatedField(WritableField):
|
||||||
widget = widgets.Select
|
widget = widgets.Select
|
||||||
cache_choices = False
|
cache_choices = False
|
||||||
empty_label = None
|
empty_label = None
|
||||||
|
default_read_only = True # TODO: Remove this
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.queryset = kwargs.pop('queryset', None)
|
self.queryset = kwargs.pop('queryset', None)
|
||||||
super(RelatedField, self).__init__(*args, **kwargs)
|
super(RelatedField, self).__init__(*args, **kwargs)
|
||||||
|
self.read_only = self.default_read_only
|
||||||
|
|
||||||
### We need this stuff to make form choices work...
|
### We need this stuff to make form choices work...
|
||||||
|
|
||||||
|
@ -260,7 +263,7 @@ class RelatedField(WritableField):
|
||||||
Return a readable representation for use with eg. select widgets.
|
Return a readable representation for use with eg. select widgets.
|
||||||
"""
|
"""
|
||||||
desc = smart_unicode(obj)
|
desc = smart_unicode(obj)
|
||||||
ident = self.to_native(obj)
|
ident = smart_unicode(self.to_native(obj))
|
||||||
if desc == ident:
|
if desc == ident:
|
||||||
return desc
|
return desc
|
||||||
return "%s - %s" % (desc, ident)
|
return "%s - %s" % (desc, ident)
|
||||||
|
@ -353,7 +356,23 @@ class PrimaryKeyRelatedField(RelatedField):
|
||||||
"""
|
"""
|
||||||
Represents a to-one relationship as a pk value.
|
Represents a to-one relationship as a pk value.
|
||||||
"""
|
"""
|
||||||
|
default_read_only = False
|
||||||
|
|
||||||
|
# TODO: Remove these field hacks...
|
||||||
|
def prepare_value(self, obj):
|
||||||
|
return self.to_native(obj.pk)
|
||||||
|
|
||||||
|
def label_from_instance(self, obj):
|
||||||
|
"""
|
||||||
|
Return a readable representation for use with eg. select widgets.
|
||||||
|
"""
|
||||||
|
desc = smart_unicode(obj)
|
||||||
|
ident = smart_unicode(self.to_native(obj.pk))
|
||||||
|
if desc == ident:
|
||||||
|
return desc
|
||||||
|
return "%s - %s" % (desc, ident)
|
||||||
|
|
||||||
|
# TODO: Possibly change this to just take `obj`, through prob less performant
|
||||||
def to_native(self, pk):
|
def to_native(self, pk):
|
||||||
return pk
|
return pk
|
||||||
|
|
||||||
|
@ -382,6 +401,21 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
|
||||||
"""
|
"""
|
||||||
Represents a to-many relationship as a pk value.
|
Represents a to-many relationship as a pk value.
|
||||||
"""
|
"""
|
||||||
|
default_read_only = False
|
||||||
|
|
||||||
|
def prepare_value(self, obj):
|
||||||
|
return self.to_native(obj.pk)
|
||||||
|
|
||||||
|
def label_from_instance(self, obj):
|
||||||
|
"""
|
||||||
|
Return a readable representation for use with eg. select widgets.
|
||||||
|
"""
|
||||||
|
desc = smart_unicode(obj)
|
||||||
|
ident = smart_unicode(self.to_native(obj.pk))
|
||||||
|
if desc == ident:
|
||||||
|
return desc
|
||||||
|
return "%s - %s" % (desc, ident)
|
||||||
|
|
||||||
def to_native(self, pk):
|
def to_native(self, pk):
|
||||||
return pk
|
return pk
|
||||||
|
|
||||||
|
@ -400,6 +434,8 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
|
||||||
|
|
||||||
|
|
||||||
class SlugRelatedField(RelatedField):
|
class SlugRelatedField(RelatedField):
|
||||||
|
default_read_only = False
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.slug_field = kwargs.pop('slug_field', None)
|
self.slug_field = kwargs.pop('slug_field', None)
|
||||||
assert self.slug_field, 'slug_field is required'
|
assert self.slug_field, 'slug_field is required'
|
||||||
|
@ -429,6 +465,7 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
pk_url_kwarg = 'pk'
|
pk_url_kwarg = 'pk'
|
||||||
slug_url_kwarg = 'slug'
|
slug_url_kwarg = 'slug'
|
||||||
slug_field = 'slug'
|
slug_field = 'slug'
|
||||||
|
default_read_only = False
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user