Django rest framework: override create () in ModelSerializer by passing an extra parameter

I am looking for a way to correctly oververride the .create() method for the ModelSerializer serializer in the Django Rest Framework to work with an additional parameter.

In my original Django model, I just overridden the .save() method to control the extra parameter. Now .save() can also be called as follows: .save(extra = 'foo') .

I need to create a ModelSerializer in this original Django model:

 from OriginalModels.models import OriginalModel from rest_framework import serializers class OriginalModelSerializer(serializers.ModelSerializer): # model fields class Meta: model = OriginalModel 

But this way I can not pass the extra parameter to the .save() model method.

How can I correctly override the .create() method of my OriginalModelSerializer class to accept (eventually) this extra parameter?

+7
python override django django-rest-framework
source share
2 answers

Hm. this may not be the ideal answer, given that I do not know how you want to convey this "extra" (ie, this is an additional field in the form, as a rule, etc.).

What you probably want to do just represents foo as a field in the serializer. Then it will be present in validated_data in create , then you can do create to do something like the following

 def create(self, validated_data): obj = OriginalModel.objects.create(**validated_data) obj.save(foo=validated_data['foo']) return obj 

You probably want to take a look at the default implementation to create for some other things that it does (for example, remove many-to-many relationships, etc.).

+13
source share

Now you can do this in a set of views (added the user as a bonus;)):

 class OriginalModelViewSet(viewsets.ModelViewSet): """ API endpoint that allows OriginalModel classes to be viewed or edited. """ serializer_class = OriginalModelSerializer queryset = OriginalModel.objects.all() def perform_create(self, serializer): user = None if self.request and hasattr(self.request, "user"): user = self.request.user serializer.save(user=user, foo='foo') 

Thus, the Serializer can remain universal, that is:

 class OriginalModelSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = OriginalModel fields = '__all__' 
0
source share

All Articles