Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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 ModelSerializer-如何添加包含多个主键的附加字段?_Python_Django_Django Rest Framework_Serialization - Fatal编程技术网

Python DRF ModelSerializer-如何添加包含多个主键的附加字段?

Python DRF ModelSerializer-如何添加包含多个主键的附加字段?,python,django,django-rest-framework,serialization,Python,Django,Django Rest Framework,Serialization,我有一个名为ExampleModelCreateSerializer的ModelSerializer,它接受其模型字段的数据。但是,我希望传递不属于模型的其他数据。具体来说,我想包括一个不同型号的主键列表。为此,我使用了serializers.PrimaryKeyRelatedField(many=True) 当我试图提交一个POST请求时,我得到了这个错误。 调用'examplemodel.objects.create()'时遇到'TypeError'。这可能是因为序列化程序类中有一个可写字段

我有一个名为
ExampleModelCreateSerializer
的ModelSerializer,它接受其模型字段的数据。但是,我希望传递不属于模型的其他数据。具体来说,我想包括一个不同型号的主键列表。为此,我使用了
serializers.PrimaryKeyRelatedField(many=True)

当我试图提交一个POST请求时,我得到了这个错误。
调用'examplemodel.objects.create()'时遇到'TypeError'。这可能是因为序列化程序类中有一个可写字段不是'examplemodel.objects.create()'的有效参数。您可能需要将字段设置为只读,或重写ExampleModelCreateSerializer.create()方法以正确处理此问题。

我假设这是因为试图将附加字段保存到模型实例中。因此,我尝试在序列化程序运行有效后立即弹出该字段

def create(self, request, *args, **kwargs):
    ...
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.validated_data.pop('listofkeys')
    ...
这将返回
“examplemodel”对象没有属性“listofkeys”

我所要做的就是向这个序列化程序传递额外的字段,并且不要让这些字段和模型实例的保存和创建冲突

我已经阅读了关于类似问题的其他答案,将这些字段设置为只读,但这是否只适用于GET请求?我需要这些额外的字段通过POST提交并由序列化程序处理

注意:Serializer类还扩展了WriteableNestedModelSerializer

编辑:尝试在序列化程序中弹出它,但生成相同的AttributeError

class ExampleModelCreateSerializer(WritableNestedModelSerializer):

    listofkeys = serializers.PrimaryKeyRelatedField(
            many=True,queryset=models.another_model.objects.all())

    def create(self, validated_data):
        ...
        listofkeys = validated_data.pop('listofkeys')
        instance = super(ExampleModelCreateSerializer, self).create(validated_data)
        return instance

    class Meta:
        model = example_model
        fields = ('field1', 'field2', ..., 'listofkeys', )

显示完整的序列化程序。@MuhammadHassan已更新为完整的序列化程序