React/Django App:在使用序列化器保存之前,需要在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两次,然后在序列化器上再次调用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)

最新更新