繁体   English   中英

React / Django App:需要在使用序列化程序保存之前更新放置路由中的字段,在后端使用自定义函数

[英]React/Django App: Need to update a field in a put route, with a custom function in the backend, before saving with a serializer

我正在尝试使用自己的功能更改字段的内容。 我正在使用一个简化的函数,在每个单词之间添加逗号。 我希望能够将我的逗号语句发送到前端,但我不知道如何使用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM