django rest框架基于自定义类反序列化对象

No_*_*Fun 5 python django deserialization django-rest-framework

我想反序列化这个json:

json1 = {
    "age" : "22",
    "name" : "Bob",
    "lastname" : "Andrew",
    "contactList" : [
    { "friend" : "Alice"},
    {  "friend" : "John"}
]}
Run Code Online (Sandbox Code Playgroud)

我创建了以下类(我不想创建任何模型,因为我对将它们保存在数据库中不感兴趣):

class Friend(object):
    def __init__(self, friend):
        self.friend = friend

class Person(object):
    def __init__(self, age , name , lastname, contactList):
        self.age=age
        self.name = name
        self.lastname = lastname
        self.contactList= []   #possible error here 
Run Code Online (Sandbox Code Playgroud)

以及以下序列化程序:

class FriendSeriliazer(serializers.Serializer):
    friend = serializers.CharField()

    def create(self, validated_data):
        return Friend(**validated_data)

class PersonSerializer(serializers.Serializer):
    age = serializers.CharField()
    name = serializers.CharField()
    lastname = serializers.CharField()
    contactList = FriendSerializer(many=True)

    def create(self, validated_data):
         print validated_data
         simple = Person(**validated_data)
         contactList = self.validated_data.pop('contactList')
         for friend in contactList:
             serializer = FriendSerializert(data=friend)
             if serializer.is_valid(raise_exception=True):
                person.contactList.append(serializer.save())
         return person
Run Code Online (Sandbox Code Playgroud)

视图中的 POST 方法:

    parsedData = PersonSerializer(data=request.data)
    person = parsedData.save()
    print person.contactList[0].friend #<-- nested object should be present  
    return Response(request.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

我为此使用了 drf文档

问题是,虽然这行得通,但我需要反序列化一个更复杂的 json,并且迭代 create 函数中的内部对象并不会削减它。有没有更自动化的方法?

Lou*_*iro 1

在您的情况下,您不想保存在数据库中,而是保存在对象中,并且Django-Rest-Framework 默认情况下不支持可写嵌套序列化器,那么没有比您正在做的更好的解决方案了。您必须自己实施这个过程。

默认情况下,嵌套序列化器是只读的。如果您想支持对嵌套序列化器字段的写入操作,您需要创建 create()和/或update()方法,以便显式指定应如何保存子关系。

阅读 Django-Rest-Framework 文档以获取更多信息:可写嵌套关系