python - DRF ModelSerializer - 如何添加一个包含许多主键的附加字段?
问题描述
我有一个 ModelSerializer 命名ExampleModelCreateSerializer
为它的模型字段接受数据。但是,我想传递不属于模型的其他数据。具体来说,我想包括一个不同模型的主键列表。为此,我正在使用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'
我要做的就是将额外的字段传递给这个序列化器,而不是让这些字段与模型实例的保存和创建发生冲突。
我已经阅读了其他类似问题的答案,以使这些字段成为只读字段,但这仅适用于 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', )
解决方案
推荐阅读
- flutter - 如何线性增加 Slider Widget 中的 tickMarkRadius?
- vba - VBA Solidworks 宏帮助 - 在多张图纸上替换工程图中的模型
- decompiler - 尽管使用 eclipse 配置了 jadclipse,但无法反编译类
- python-3.x - 我正在使用 IBM Cloud Object Storage 并希望从存储中读取 pdf 文件并希望以字符串的形式存储其文本内容
- jenkins - 使用 Jenkins 中的 if 块自定义松弛消息
- sql - 如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表
- javascript - 水平和垂直视口中没有空间时如何自动定位弹出箭头?
- python - 使用 beautifulsoup 循环页面
- numpy - 绘制一个 3 维 numpy 数组
- c# - WPF 按钮单击没有引用