Django rest framework (ModelViewSet): insert a parameter before save.

641 views
Skip to first unread message

Sidon

unread,
May 14, 2017, 7:44:42 PM5/14/17
to Django REST framework
I am looking a way for insert a parameter in a data serializer before save, I have a model with only 2 fields, for stay easy, let's consider that both are of an API service on the internet, like twitter. For example.

I have to accept a command line, via curl, like this:
curl -X POST -F twitter_id=1399 http://localhost:8000/api/users/, then to consult the api service and, finally, save on my database.

My problem is: There is just one parameter (twitter_id) on the query, how to insert a second parameter (twitter_name)?

Below I show my code and my try (commented)

model:
    class User(models.Model):
        twitter_id
        twitter_name 

view.py:

    class UserViewSet(viewsets.ModelViewSet):
        serializer_class = UserSerializer
        queryset = User.objects.all()

        def get_queryset(self):
            queryset = User.objects.all()
            twt_id = self.request.query_params.get('twitter_id', None)
            limit = self.request.query_params.get('limit', None)
    
            if tw_id is not None:
                queryset = queryset.filter(twitter_id=tw_id)
            elif limit is not None:        
                queryset = queryset[:int(limit)]
            return queryset
    
serializer.py

    class UserSerializer(serializers.ModelSerializer):
        links = serializers.SerializerMethodField()
        data_twt = {}
        
        class Meta:
            model = user
            fields = ('twitter_id', 'twitter_name')
    
         # ... 
   
        def get_links(self, obj):
            request = self.context['request']
            links = {'self': reverse('person-detail', kwargs={'pk': obj.pk}, request=request)}

        def validate(self, data):
            if bool(self.context['request'].POST):
                tw_id = str(data['twitter_id'])
                _tw_id = User.objects.filter(twitter_id=fb_id)
                if _tw_id.exists():
                    raise serializers.ValidationError('User already registered')
                else:
                    try:
                        self.data_twt = get_twitter_person(fb_id)
                        # Here I tried to modify data, but data is read only
                        # data['twitter_name'] = self.data_twt['name']
                    except:
                        raise serializers.ValidationError('Id not in Twitter')
            return data


Sidon

unread,
May 15, 2017, 6:51:40 AM5/15/17
to Django REST framework
Ok, Finally, I solve my issue: In UserViewSet:


   
def perform_create(self, serializer):
        serializer
.save(twitter_name='Blah Blah'
Reply all
Reply to author
Forward
0 new messages