sid8491
sid8491

Reputation: 6800

Rest API schema to retrieve value from database and return

I need to make a Rest API which will take 3 inputs: input_list (list of srings sentences), from_lang (string), to_lang (string) and return list of string after fetching values from databse table. Example:

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']}

A service will call this API with list of sentences in any supported language, and in return they will get list of same length with translated sentence if it exist in database or null value if it doesn't exist.

How should I proceed?

What I have done is, I have created a serializer to handle/validate incoming request in 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])

And I have defined a simple model for storing translations in 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)

Then in my views.py I have handled post requests like below

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)

So far so good, now I am confused how to fetch the data from model, and how to return it (following best practices). I have defined a function get_translations() in views.py :

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

I mainly have three confusions:

Any help is appreciated.

Upvotes: 0

Views: 392

Answers (1)

ahmed osama
ahmed osama

Reputation: 61

Is it good practice to use serializers.Serializer for handling/validating incoming requests

Of course, It is. That's essentially one of the core concepts of seriaizers (Parsing, Validation and serialization)

Should I use serializers for model as well, if yes how

There is no need for that. You only need a serializer if data is being sent or received from the user which is not the case here.

How to pass filter value dynamically

Use dictionary unpacking

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

Upvotes: 1

Related Questions