Приложение React/Django: Необходимо обновить поле в маршруте put, с помощью пользовательской функции в бэкенде, перед сохранением с помощью сериализатора

Я пытаюсь изменить содержимое поля с помощью собственной функции. Я использую упрощенную функцию, которая добавляет запятые между каждым словом. Я хочу иметь возможность отправить предложение с запятыми на фронтенд, но я не знаю, как это сделать с помощью сериализатора, который был дан в документации Django. Я не могу найти ни одного примера в сети, чтобы кто-то пытался это сделать. Мне также нужно сделать это в бэкенде, потому что некоторые из моих других пользовательских функций нуждаются в доступе к определенной библиотеке python.

Вот мой api > views.py

@api_view(['PUT'])
def accentLine(request, pk):
    data = request.data
    line = Lines.objects.get(id=pk)

    if data['accent'] == 'shatner':
        shatnerLine = line.content.replace(' ', ', ')
        line.translation = shatnerLine
        line.save()

    serializer = LineSerializer(instance=line, data=data)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)

Вот мой api > models.py

class Lines(models.Model):
    # userId = models.ForeignKey(Users, on_delete=models.CASCADE)
    script = models.ForeignKey(Scripts, null=True, on_delete=models.SET_NULL)
    title = models.CharField(max_length=50, null=True)
    content = models.TextField(max_length=5000, null=True)
    accent = models.CharField(max_length=50, default='english')
    translation = models.TextField(max_length=5000, null=True)
    updatedAt = models.DateField(auto_now=True)

Вот мой api > serializers.py

from rest_framework.serializers import ModelSerializer
from .models import Lines

class LineSerializer(ModelSerializer):
    class Meta:
        model = Lines
        fields = '__all__'

Прежде всего, вы вызываете save на экземпляре модели дважды, вызывая его непосредственно на экземпляре, а затем снова на сериализаторе. Метод сохранения сериализатора будет выполнять сохранение на самом экземпляре модели. Документация по сохранению экземпляров с помощью сериализаторов: https://www.django-rest-framework.org/api-guide/serializers/#saving-instances

Для достижения желаемого результата вам следует создать пользовательское поле сериализатора, вероятно, под названием TranslationField и либо переопределить метод to_internal_value, чтобы выполнить мутацию строки перед сохранением данных в базе данных, либо переопределить to_representation, который будет выполнять мутацию строки перед возвратом данных из сериализатора. Это зависит от того, хотите ли вы сохранить поле... с запятыми или добавить запятые при получении данных через сериализатор. Документация по пользовательским полям здесь: https://www.django-rest-framework.org/api-guide/fields/#custom-fields

После установки пользовательского поля вы не будете выполнять никаких мутаций в представлении accentLine и вместо этого просто передадите данные запроса сериализатору следующим образом

@api_view(['PUT'])
def accentLine(request, pk):
    data = request.data
    line = Lines.objects.get(id=pk)

    serializer = LineSerializer(instance=line, data=data)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)
Вернуться на верх