Как получить данные из пользовательского serializer.CharField() после обновления?

У меня есть 2 модели. CollabDocument и CollabVersions. Вместе они похожи на документ, который отслеживает свои изменения. Бинарное поле только потому, что содержимое зашифровано.

class CollabDocument(models.Model):
    name = models.CharField(max_length=4096, null=False, blank=False)

class CollabVersion(EncryptedModelMixin, models.Model):
    document = models.ForeignKey(CollabDocument, related_name="versions", on_delete=models.CASCADE)
    content = models.BinaryField(blank=True)

У меня есть этот базовый сериализатор:

class CollabDocumentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(required=True)

    class Meta:
        model = CollabDocument
        fields = "__all__"

Важным является поле content в следующем сериализаторе. Я вызываю метод patch -> update документа совместной работы, после чего создается новая версия. Таким образом, сохраняется история всех внесенных изменений. Этот сериализатор не обновляет сам документ, btw.

class CollabDocumentUpdateSerializer(CollabDocumentSerializer):
    content = serializers.CharField(write_only=True) # <-- without write_only=True I get a 500 error

    def update(self, instance, validated_data):
        version = CollabVersion(content=validated_data['content'], document=instance)
        version.encrypt(request=self.context['request'])
        version.save()
        return instance

Вот моя проблема: я не могу получить содержимое в ответе, если я убираю write_only=True, то запрос не проходит. Что я хочу:

{
  id: 1,
  content: '<h1>awesome document</h1>',
  name: 'My Document'
}

Что я получаю вместо этого:

{
  id: 1,
  name: 'My Document'
}

В моем сериализаторе retrieve я сделал следующее:

class CollabDocumentRetrieveSerializer(CollabDocumentSerializer):
    content = serializers.SerializerMethodField()
    quill = serializers.SerializerMethodField()

    def get_latest_version(self, obj):
        if not hasattr(self, 'latest_version'):
            self.latest_version = obj.versions.order_by('-created').first()
            if self.latest_version is None:
                raise NotFound()
        return self.latest_version

    def get_content(self, obj):
        latest_version = self.get_latest_version(obj)
        latest_version.decrypt(request=self.context['request'])
        return latest_version.content

Есть ли способ получить поле content в ответе после операции обновления?

Вернуться на верх