aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-10-04 22:07:24 +0100
committerTom Christie2012-10-04 22:07:24 +0100
commit693892ed0104b8ce8cd801e7bec6107feeb88782 (patch)
treeae049236abc6868c0b48803a04e8dc7cd4d5040c
parentcc0d2601b8dfdf3f5fcee8591540b9cb4b2f3e44 (diff)
downloaddjango-rest-framework-693892ed0104b8ce8cd801e7bec6107feeb88782.tar.bz2
Fix for field to make it easier to access field relationships
-rw-r--r--rest_framework/fields.py6
-rw-r--r--rest_framework/tests/genericrelations.py33
-rw-r--r--rest_framework/tests/models.py24
3 files changed, 62 insertions, 1 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index be918235..b9ac3776 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -83,6 +83,10 @@ class Field(object):
if is_protected_type(value):
return value
+
+ all_callable = getattr(value, 'all', None)
+ if is_simple_callable(all_callable):
+ return [self.to_native(item) for item in value.all()]
elif hasattr(value, '__iter__') and not isinstance(value, (dict, basestring)):
return [self.to_native(item) for item in value]
return smart_unicode(value)
@@ -197,7 +201,7 @@ class ModelField(WritableField):
value = self.model_field._get_val_from_obj(obj)
if is_protected_type(value):
return value
- return self.model_field.value_to_string(self.obj)
+ return self.model_field.value_to_string(obj)
def attributes(self):
return {
diff --git a/rest_framework/tests/genericrelations.py b/rest_framework/tests/genericrelations.py
new file mode 100644
index 00000000..d88a6c06
--- /dev/null
+++ b/rest_framework/tests/genericrelations.py
@@ -0,0 +1,33 @@
+from django.test import TestCase
+from rest_framework import serializers
+from rest_framework.tests.models import *
+
+
+class TestGenericRelations(TestCase):
+ def setUp(self):
+ bookmark = Bookmark(url='https://www.djangoproject.com/')
+ bookmark.save()
+ django = Tag(tag_name='django')
+ django.save()
+ python = Tag(tag_name='python')
+ python.save()
+ t1 = TaggedItem(content_object=bookmark, tag=django)
+ t1.save()
+ t2 = TaggedItem(content_object=bookmark, tag=python)
+ t2.save()
+ self.bookmark = bookmark
+
+ def test_reverse_generic_relation(self):
+ class BookmarkSerializer(serializers.ModelSerializer):
+ tags = serializers.Field(source='tags')
+
+ class Meta:
+ model = Bookmark
+ exclude = ('id',)
+
+ serializer = BookmarkSerializer(instance=self.bookmark)
+ expected = {
+ 'tags': [u'django', u'python'],
+ 'url': u'https://www.djangoproject.com/'
+ }
+ self.assertEquals(serializer.data, expected)
diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py
index 969c8297..7c7f485b 100644
--- a/rest_framework/tests/models.py
+++ b/rest_framework/tests/models.py
@@ -1,4 +1,7 @@
from django.db import models
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation
+
# from django.contrib.auth.models import Group
@@ -59,3 +62,24 @@ class CallableDefaultValueModel(RESTFrameworkModel):
class ManyToManyModel(RESTFrameworkModel):
rel = models.ManyToManyField(Anchor)
+
+# Models to test generic relations
+
+
+class Tag(RESTFrameworkModel):
+ tag_name = models.SlugField()
+
+
+class TaggedItem(RESTFrameworkModel):
+ tag = models.ForeignKey(Tag, related_name='items')
+ content_type = models.ForeignKey(ContentType)
+ object_id = models.PositiveIntegerField()
+ content_object = GenericForeignKey('content_type', 'object_id')
+
+ def __unicode__(self):
+ return self.tag.tag_name
+
+
+class Bookmark(RESTFrameworkModel):
+ url = models.URLField()
+ tags = GenericRelation(TaggedItem)