Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何延迟加载嵌套序列化程序';drf中的字段是否为s类?_Python_Django_Serialization_Django Rest Framework - Fatal编程技术网

Python 如何延迟加载嵌套序列化程序';drf中的字段是否为s类?

Python 如何延迟加载嵌套序列化程序';drf中的字段是否为s类?,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,如何创建具有如下对象的通用对象: { "_type": "A", "content_object": { "a's_field": "something..", } } { "_type": "B", "content_object": { "b's_field": "something else..", "b's_field_2": "something else.." } } 并创建一个具有B对象的通用对

如何创建具有如下对象的通用对象:

{
    "_type": "A",
    "content_object": {
      "a's_field": "something..",
    }
}
{
    "_type": "B",
    "content_object": {
      "b's_field": "something else..",
      "b's_field_2": "something else.."
    }
}
并创建一个具有B对象的通用对象,如下所示:

{
    "_type": "A",
    "content_object": {
      "a's_field": "something..",
    }
}
{
    "_type": "B",
    "content_object": {
      "b's_field": "something else..",
      "b's_field_2": "something else.."
    }
}
序列化程序.py

class ContentObjectSerializer(serializers.Serializer):

    def to_representation(self, value):
        """
        Serialize A instances using a A serializer,
        and B  instances using a B serializer.
        """

        if isinstance(value, A):
            serializer = ASerializer(value)
        elif isinstance(value, B):
            serializer = BSerializer(value)
        else:
            raise Exception('Unexpected type of tagged object')

        return serializer.data

    def to_internal_value(self, data):

        _type = self.parent.initial_data.get("_type", None)
        if not _type:
            return None

        context = self.parent.context
        if _type == "A":
            serializer = ASerializer(context=context)
        elif _type == "B":
            serializer = BSerializer(context=context)

        return serializer.to_internal_value(data)


class GenericSerializer(ModelSerializer):
    content_object = ContentObjectSerializer()

    class Meta:
        model = Generic
        fields = ("_type", "content_object", )

    def create(self, validated_data):
        # question = validated_data.pop("content_object")
        # is an ordered dictionary & not a dictionary
        # because of the below reason:
        # my guess is that parent serializer's save calls create,
        # passing validated_data
        # validations are performed and
        # validated_data is obtained from to_internal_value
        # and converted to dict
models.py

class Generic(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
views.py

class GenericViewSet(ModelViewSet):
    serializer_class = GenericSerializer
    permission_classes = (IsAuthenticated,)
    queryset = Generic.objects.all()

我需要一种使用同一端点创建不同模型对象的方法。

这不是一个明确的解释。例如,您需要支持带有嵌套对象的POST,还是只支持带有ID的POST?到底是什么不起作用?这不是一个明确的解释。例如,您需要支持带有嵌套对象的POST,还是只支持带有ID的POST?到底是什么不起作用?