Приложение 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)