【发布时间】: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