在创建主键之前序列化相关对象

时间:2019-10-02 19:33:10

标签: django django-models django-rest-framework django-views django-serializer

因此,我有一个序列化器,为此添加了一个自定义create方法,因为我正在使用它为多对多关系插入对象,并且为此使用了嵌套序列化器。

就目前而言,当我尝试使用DocumentSerializer创建对象时,我遇到了"document":["This field is required."]错误,因为声明了documentdomain_set变量时,关联文档尚未被创建,因此在该关系中没有要使用的ID。我显然知道在保存新的document_id对象之后如何捕获此document,但是我不确定最好的做法是处理变量初始化。谢谢!

class DocumentDomainSerializer(serializers.ModelSerializer):
    domain = serializers.SerializerMethodField('get_domain_id')

    class Meta:
        model = DocumentDomain
        fields = ('document_id', 'domain_id')

class DocumentSerializer(serializers.ModelSerializer):

    documentdomain_set = DocumentDomainSerializer(many=True, required=False)

    class Meta:
        model = Document
        fields = ( 'documentdomain_set', 'id', 'text', 'uploaded_at')
        extra_kwargs = {
            'id': {'read_only': True},
            'uploaded_at': {'read_only': True}
        }

    def create(self, validated_data):
        documentdomain_set = documentdomain_set.pop('documentdomain_set', [])

        # create document first
        document = Document.objects.create(**validated_data)
        # serialize associated domains
        for documentdomain in documentdomain_set:
            # get ID of newly-created document, use for relation
            documentdomain['document_id'] = document
            DocumentDomain.objects.create(**documentdomain)

        return document

0 个答案:

没有答案