diff options
| author | Tom Christie | 2012-10-30 03:32:55 -0700 |
|---|---|---|
| committer | Tom Christie | 2012-10-30 03:32:55 -0700 |
| commit | 51a53b497ba794fb77a6dfed072db67087756fe3 (patch) | |
| tree | 1ee5e2346f469bc868276aadc1a5b3a4ed6a732a /rest_framework/fields.py | |
| parent | 5f0d4ef2fcbb0206ae456dd6553551cd0039c92d (diff) | |
| parent | f4edd9256667af205f4edf9ada642ef9a62802e4 (diff) | |
| download | django-rest-framework-51a53b497ba794fb77a6dfed072db67087756fe3.tar.bz2 | |
Merge pull request #335 from tomchristie/related-field-as-instance
Writable related fields should return a model instance from .from_native...
Diffstat (limited to 'rest_framework/fields.py')
| -rw-r--r-- | rest_framework/fields.py | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 067b1087..bb7d0918 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -244,7 +244,7 @@ class RelatedField(WritableField): return value = data.get(field_name) - into[(self.source or field_name) + '_id'] = self.from_native(value) + into[(self.source or field_name)] = self.from_native(value) class ManyRelatedMixin(object): @@ -288,6 +288,12 @@ class PrimaryKeyRelatedField(RelatedField): def to_native(self, pk): return pk + def from_native(self, data): + try: + return self.queryset.get(pk=data) + except ObjectDoesNotExist: + raise ValidationError('Invalid hyperlink - object does not exist.') + def field_to_native(self, obj, field_name): try: # Prefer obj.serializable_value for performance reasons @@ -379,7 +385,7 @@ class HyperlinkedRelatedField(RelatedField): # Try explicit primary key. if pk is not None: - return pk + queryset = self.queryset.filter(pk=pk) # Next, try looking up by slug. elif slug is not None: slug_field = self.get_slug_field() @@ -392,7 +398,7 @@ class HyperlinkedRelatedField(RelatedField): obj = queryset.get() except ObjectDoesNotExist: raise ValidationError('Invalid hyperlink - object does not exist.') - return obj.pk + return obj class ManyHyperlinkedRelatedField(ManyRelatedMixin, HyperlinkedRelatedField): |
