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

时间:2018-06-20 16:25:22

标签: python django django-rest-framework serializer

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

当我尝试提交POST请求时,出现此错误。 Got a `TypeError` when calling `examplemodel.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `examplemodel.objects.create()`. You may need to make the field read-only, or override the ExampleModelCreateSerializer.create() method to handle this correctly.

我认为这是因为尝试将其他字段保存到模型实例中。因此,我尝试在序列化程序运行is_valid之后立即弹出该字段。

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' object has no attribute 'listofkeys'

我要做的就是将其他字段传递给此Serializer,并且不要让这些字段与模型实例的保存和创建冲突。

我已经阅读了其他类似问题的答案,以使这些字段为只读,但那不是仅适用于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', )

0 个答案:

没有答案