DRF:非模型序列化程序不适用于非模型类

时间:2016-07-05 13:02:54

标签: django-rest-framework

我正在使用djangorestframework == 3.3.2和Python 2.7.11 +

我在json中有数据代表这个类的实例:

class APITransaction(object):

    def __init__(self, created_on):  #several_other_attrs
        self.created_on = parser.parse(created_on)  # this is Never called
        # ... several other fields

    @staticmethod
    def create(attributes_json):
        return APITransaction(attributes_json.get('createdOn'), ... )

序列化器:

class MySerializer(serializers.Serializer):
    created_on = serializers.DateTimeField()
    # ... more fields here

    class Meta:
        ordering = ['-created_on']

    def create(self, validated_data):
        return APITransaction.create(**validated_data)   # why isn't this called?

    def update(self, instance, validated_data):
        raise NotImplemented

现在我正在尝试使用该序列化程序:

class TransactionView(viewsets.ViewSet):
    serializer_class = MySerializer   # probably useless

    def list(self, request):
         # ...
         serializer = MySerializer(list_of_json, many=True)
         return Response(serializer.data)

其中list_of_json是表示APITransaction类的json列表。

不幸的是,由于永远不会调用'unicode' object has no attribute 'isoformat'因此APITransaction.create parser.parse从未用于投射字符串,因此导致APITransaction.__init__错误。< / p>

我知道这不是用户序列化程序的正确方法,但DRF文档并未提及有关非ORM类时应执行的操作的任何内容。

关于如何使用Serializer的任何想法?当我只有一个实例时,我能够显式构建APITransaction对象,然后在MySerializer上传递它,但是当我有多个内部json时,是不是自动执行此操作?

1 个答案:

答案 0 :(得分:0)

  

永远不会调用APITransaction.create

您正在序列化数据。 create只会在反序列化期间被调用,因此预计不会被调用。

请注意,list是一种不应创建数据的安全方法。 Viewset create可能是你想要的。此外,您需要验证数据并保存序列化程序。

您应该特别浏览step 1 of the Django REST framework tutorialworking with serializer