mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-06 05:20:12 +03:00
modelserializer support
This commit is contained in:
parent
3c7bd7f7f5
commit
85714ee3d9
|
@ -1323,6 +1323,15 @@ class RecursiveField(Field):
|
|||
self.to = to
|
||||
self.kwargs = kwargs
|
||||
|
||||
# Need to properly initialize by calling super-constructor for
|
||||
# ModelSerializers
|
||||
super_kwargs = dict(
|
||||
(key, kwargs[key])
|
||||
for key in kwargs
|
||||
if key in inspect.getargspec(Field.__init__)
|
||||
)
|
||||
super(RecursiveField, self).__init__(**super_kwargs)
|
||||
|
||||
def bind(self, field_name, parent):
|
||||
if hasattr(parent, 'child') and parent.child is self:
|
||||
# RecursiveField nested inside of a ListField
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from django.db import models
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
|
@ -32,6 +33,19 @@ class SillySerializer(serializers.Serializer):
|
|||
self = serializers.RecursiveField(required=False)
|
||||
|
||||
|
||||
class RecursiveModel(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
parent = models.ForeignKey('self', null=True)
|
||||
|
||||
|
||||
class RecursiveModelSerializer(serializers.ModelSerializer):
|
||||
parent = serializers.RecursiveField(allow_null=True)
|
||||
|
||||
class Meta:
|
||||
model = RecursiveModel
|
||||
fields = ('name', 'parent')
|
||||
|
||||
|
||||
class TestRecursiveField:
|
||||
@staticmethod
|
||||
def serialize(serializer_class, value):
|
||||
|
@ -152,3 +166,23 @@ class TestRecursiveField:
|
|||
serializer = SillySerializer(data=way_too_long)
|
||||
assert not serializer.is_valid(), \
|
||||
'validation should fail on inner link validation'
|
||||
|
||||
def test_model_serializer(self):
|
||||
one = RecursiveModel(name='one')
|
||||
two = RecursiveModel(name='two', parent=one)
|
||||
|
||||
#serialization
|
||||
representation = {
|
||||
'name': 'two',
|
||||
'parent': {
|
||||
'name': 'one',
|
||||
'parent': None,
|
||||
}
|
||||
}
|
||||
|
||||
s = RecursiveModelSerializer(two)
|
||||
assert s.data == representation
|
||||
|
||||
#deserialization
|
||||
self.deserialize(RecursiveModelSerializer, representation)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user