【问题标题】:Rest API schema to retrieve value from database and returnRest API 模式从数据库中检索值并返回
【发布时间】:2020-10-07 08:51:21
【问题描述】:

我需要创建一个 Rest API,它将接受 3 个输入:input_list(srings 语句列表)、from_lang(字符串)、to_lang(字符串)并在从数据库表中获取值后返回字符串列表. 示例:

input - {input_list: ['how are you', 'see you later', 'where are you'], from_lang: 'english', to_lang: 'spanish' }

output - {['cómo estás', 'nos vemos más tarde', 'Dónde estás']}

服务将使用任何受支持语言的句子列表调用此 API,作为回报,如果数据库中存在已翻译句子,则它们将获得与翻译句子相同长度的列表,如果不存在则为空值。

我应该如何进行?

我所做的是,我创建了一个序列化程序来处理/验证serializers.py 中的传入请求:

def supported_lang(value):
    if value not in SUPPORTED_LANGUAGES:
        print(value)
        print(SUPPORTED_LANGUAGES)
        raise serializers.ValidationError('Language not supported')

class TranslateSerializer(serializers.Serializer):
   input_list = serializers.ListField(
       child=serializers.CharField(allow_blank=False),
       allow_empty=False
   )
   from_language = serializers.CharField(validators=[supported_lang])
   to_language = serializers.CharField(validators=[supported_lang])

我已经定义了一个简单的模型,用于在model.py 中存储翻译:

class TranslationModel(models.Model):
    english = models.CharField(blank=False, max_length=MAX_LENGTH, unique=True)
    spanish = models.CharField(blank=True, max_length=MAX_LENGTH)
    italian = models.CharField(blank=True, max_length=MAX_LENGTH)
    is_active = models.BooleanField(default=True)

然后在我的views.py 中,我处理了如下的帖子请求

class TranslateView(views.APIView):
    def post(self, request):
        serializer = TranslateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serialized_data = serializer.validated_data
        result = self.get_translations(serialized_data)  # here i am confused
        return Response(result)

到目前为止一切顺利,现在我很困惑如何从模型中获取数据,以及如何返回它(遵循最佳实践)。 我在views.py 中定义了一个函数get_translations()

def get_translations(self, request):
        output_list = []    # for return response
        for sentence in request['input_list']:
            if request['from_language'] == 'english':
                queryset = TranslationModel.objects.filter(english=sentence)
            elif request['from_language'] == 'spanish':
                queryset = TranslationModel.objects.filter(hindi=sentence)
            elif request['from_language'] == 'italian':
                queryset = TranslationModel.objects.filter(telugu=sentence)
            try:
                resp = queryset.values()[0][request['to_language']]
            except:
                resp = ""
            if not resp:
                # print('empty response')
                output_list.append(None)
            else:
                output_list.append(resp)
        return output_list

我主要有三个困惑:

  • 使用 serializers.Serializer 处理/验证传入请求是一种好习惯
  • 我是否也应该对模型使用序列化程序,如果是的话如何
  • 如何动态传递过滤器值

感谢任何帮助。

【问题讨论】:

    标签: python django django-models serialization django-rest-framework


    【解决方案1】:

    使用 serializers.Serializer 处理/验证传入请求是一种好习惯

    当然,是的。这本质上是序列化器的核心概念之一(解析、验证和序列化)

    我是否也应该对模型使用序列化程序,如果是的话如何

    没有必要这样做。如果数据正在从用户发送或接收,您只需要一个序列化程序,这里不是这种情况。

    如何动态传递过滤器值

    使用字典解包

    k = {request['from_language']: sentence}
    queryset = TranslationModel.objects.filter(**k)
    

    【讨论】:

    • 哇,**k 创造了奇迹。实际上响应将被发送给用户,这就是我考虑使用序列化器的原因。
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2017-09-02
    • 2013-10-08
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多