aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-10-04 02:37:39 -0700
committerTom Christie2012-10-04 02:37:39 -0700
commitad2149767bea4fcd07348ca77f6cad5719a44181 (patch)
tree1b74317c74794a868856c8db0cf247e3e7034a8a
parent0a769f261e79272cf1be6add1bf96aaeec59fb05 (diff)
parentd79e18963e64c1714a29ece6ca59a8a4a1c02516 (diff)
downloaddjango-rest-framework-ad2149767bea4fcd07348ca77f6cad5719a44181.tar.bz2
Merge pull request #278 from tomchristie/related-field-fixes
Related field fixes
-rw-r--r--docs/api-guide/fields.md43
-rw-r--r--rest_framework/tests/models.py31
-rw-r--r--rest_framework/tests/serializer.py61
3 files changed, 118 insertions, 17 deletions
diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md
new file mode 100644
index 00000000..009d2a79
--- /dev/null
+++ b/docs/api-guide/fields.md
@@ -0,0 +1,43 @@
+<a class="github" href="fields.py"></a>
+
+# Serializer fields
+
+> Flat is better than nested.
+>
+> &mdash; [The Zen of Python][cite]
+
+# Generic Fields
+
+## Field
+
+## ModelField
+
+# Typed Fields
+
+## BooleanField
+
+## CharField
+
+## EmailField
+
+## DateField
+
+## DateTimeField
+
+## IntegerField
+
+## FloatField
+
+# Relational Fields
+
+Relational fields are used to represent model relationships.
+
+## PrimaryKeyRelatedField
+
+## ManyPrimaryKeyRelatedField
+
+## HyperlinkedRelatedField
+
+## ManyHyperlinkedRelatedField
+
+[cite]: http://www.python.org/dev/peps/pep-0020/
diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py
index c90668ca..969c8297 100644
--- a/rest_framework/tests/models.py
+++ b/rest_framework/tests/models.py
@@ -28,25 +28,34 @@ from django.db import models
# 'pk': self.id
# })
-class Anchor(models.Model):
+def foobar():
+ return 'foobar'
+
+
+class RESTFrameworkModel(models.Model):
"""
- A simple model to use as the target of relationships for other test models.
+ Base for test models that sets app_label, so they play nicely.
"""
- text = models.CharField(max_length=100, default='anchor')
-
class Meta:
app_label = 'rest_framework'
+ abstract = True
-class BasicModel(models.Model):
+class Anchor(RESTFrameworkModel):
+ text = models.CharField(max_length=100, default='anchor')
+
+
+class BasicModel(RESTFrameworkModel):
text = models.CharField(max_length=100)
- class Meta:
- app_label = 'rest_framework'
+class DefaultValueModel(RESTFrameworkModel):
+ text = models.CharField(default='foobar', max_length=100)
-class ManyToManyModel(models.Model):
- rel = models.ManyToManyField(Anchor)
- class Meta:
- app_label = 'rest_framework'
+class CallableDefaultValueModel(RESTFrameworkModel):
+ text = models.CharField(default=foobar, max_length=100)
+
+
+class ManyToManyModel(RESTFrameworkModel):
+ rel = models.ManyToManyField(Anchor)
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index db342c9e..08a7a9d0 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -202,9 +202,58 @@ class ManyToManyTests(TestCase):
self.assertEquals(instance.pk, 2)
self.assertEquals(list(instance.rel.all()), [])
- # def test_deserialization_for_update(self):
- # serializer = self.serializer_class(self.data, instance=self.instance)
- # expected = self.instance
- # self.assertEquals(serializer.is_valid(), True)
- # self.assertEquals(serializer.object, expected)
- # self.assertTrue(serializer.object is expected)
+
+class DefaultValueTests(TestCase):
+ def setUp(self):
+ class DefaultValueSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = DefaultValueModel
+
+ self.serializer_class = DefaultValueSerializer
+ self.objects = DefaultValueModel.objects
+
+ def test_create_using_default(self):
+ data = {}
+ serializer = self.serializer_class(data)
+ self.assertEquals(serializer.is_valid(), True)
+ instance = serializer.save()
+ self.assertEquals(len(self.objects.all()), 1)
+ self.assertEquals(instance.pk, 1)
+ self.assertEquals(instance.text, 'foobar')
+
+ def test_create_overriding_default(self):
+ data = {'text': 'overridden'}
+ serializer = self.serializer_class(data)
+ self.assertEquals(serializer.is_valid(), True)
+ instance = serializer.save()
+ self.assertEquals(len(self.objects.all()), 1)
+ self.assertEquals(instance.pk, 1)
+ self.assertEquals(instance.text, 'overridden')
+
+
+class CallableDefaultValueTests(TestCase):
+ def setUp(self):
+ class CallableDefaultValueSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = CallableDefaultValueModel
+
+ self.serializer_class = CallableDefaultValueSerializer
+ self.objects = CallableDefaultValueModel.objects
+
+ def test_create_using_default(self):
+ data = {}
+ serializer = self.serializer_class(data)
+ self.assertEquals(serializer.is_valid(), True)
+ instance = serializer.save()
+ self.assertEquals(len(self.objects.all()), 1)
+ self.assertEquals(instance.pk, 1)
+ self.assertEquals(instance.text, 'foobar')
+
+ def test_create_overriding_default(self):
+ data = {'text': 'overridden'}
+ serializer = self.serializer_class(data)
+ self.assertEquals(serializer.is_valid(), True)
+ instance = serializer.save()
+ self.assertEquals(len(self.objects.all()), 1)
+ self.assertEquals(instance.pk, 1)
+ self.assertEquals(instance.text, 'overridden')