DjangoREST:从POST请求中提取值以在重写的创建方法中使用



我试图完成一个简单的任务,提取从POST请求传递的值,并将其用作覆盖的create方法中的参数。

这是示例POST请求主体JSON,并"文档化";是我要提取的字段。

### POST
{
"url": "aaaa",
"title": "bbbb",
"publisher": "bbbb",
"desc": "bbbb",
"summary": "bbbb",
"documentId": "onDKe6K"
}

使用validated_data.pop("documentId")是最明显的选择。但是,我需要DocumentListingField设置为read_only=False才能使用此方法。这个选项引起了更大的问题,因为我的Document模型有一个不容易序列化的Hashfield。

在这种情况下,还有其他方法可以达到我的目的吗?我尝试了所有这些,但他们都失败了"KeyError: documented"
  • validated_data.get("documentId"
  • validated_data("documentId"

serializers.py

from django.forms.models import model_to_dict

class DocumentListingField(serializers.RelatedField):
def to_representation(self, instance):
return model_to_dict(instance.document)
class MySourceSerializer(serializers.ModelSerializer):
Document = DocumentListingField(many=False, read_only=True)
class Meta:
model = MySource
fields = (
"id",
"url",
"title",
"publisher",
"desc",
"summary",
"Document",
)
def create(self, validated_data):
documentId = validated_data.get("documentId").  <========= LINE OF INTEREST
print(documentId)
source = MySource.objects.create(
document=Document.objects.get(id=documentId), **validated_data
)
print(validated_data)
source.save()
return source

我认为可以在序列化器中设置documentId字段。

class MySourceSerializer(serializers.ModelSerializer):
Document = DocumentListingField(many=False, read_only=True)
documentId = serializers.CharField(write_only = True)
lass Meta:
model = MySource
fields = (
...
"documentId",
)

最新更新