Как получить данные из пользовательского 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 в ответе после операции обновления?