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.to = to
|
||||||
self.kwargs = kwargs
|
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):
|
def bind(self, field_name, parent):
|
||||||
if hasattr(parent, 'child') and parent.child is self:
|
if hasattr(parent, 'child') and parent.child is self:
|
||||||
# RecursiveField nested inside of a ListField
|
# RecursiveField nested inside of a ListField
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from django.db import models
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +33,19 @@ class SillySerializer(serializers.Serializer):
|
||||||
self = serializers.RecursiveField(required=False)
|
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:
|
class TestRecursiveField:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def serialize(serializer_class, value):
|
def serialize(serializer_class, value):
|
||||||
|
@ -152,3 +166,23 @@ class TestRecursiveField:
|
||||||
serializer = SillySerializer(data=way_too_long)
|
serializer = SillySerializer(data=way_too_long)
|
||||||
assert not serializer.is_valid(), \
|
assert not serializer.is_valid(), \
|
||||||
'validation should fail on inner link validation'
|
'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