Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom function which performs create and update on DRF modelViewSet

Hi there I want to create a custom method in a modelviewset which needs to perform a save and an update logic in a single post request.

Here is my breeding.viewsets.py

class BreedingViewSet(viewsets.ModelViewSet):
    queryset = Breeding.objects.all()
    serializer_class = BreedingSerializer

Since the above method has a higher level of abstraction and is actually providing or performing automatic CRUD functions.

Now the problem here is i dont have any control for a multiple queries like saving an object and updating another object in a single post request.

e.g

def save_and_update(self, request):
     // do save an object here.
     // do update an object here.

How can we achieve such powerful functionalities? Did i missed something? I found this documentation but i dont know how to implement the given instruction.

UPDATE

This is what im looking for How do I create multiple model instances with Django Rest Framework?

But the answer can only save a multiple instances in a single post request of that same model. But Im hoping also that we can perform queries for a different models in that single function.

like image 858
Roel Avatar asked Dec 06 '16 15:12

Roel


2 Answers

Well, from the comments, it looks like you want to update some unrelated model when you create your breeding model. This should be easy.

class BreedingViewSet(viewsets.ModelViewSet):
    queryset = Breeding.objects.all()
    serializer_class = BreedingSerializer

    def create(self, request):
        # do your thing here
        return super().create(request)
like image 149
Mad Wombat Avatar answered Nov 07 '22 03:11

Mad Wombat


Use this to create or update using POST

class BreedingViewSet(viewsets.ModelViewSet):
    queryset = Breeding.objects.all()
    serializer_class = BreedingSerializer


    def get_object(self):
        if self.action == 'create':
            queryset = self.filter_queryset(self.get_queryset())
            filter_kwargs = {self.lookup_field: self.request.data.get('id')}
            obj = get_object(queryset, **filter_kwargs)
            self.check_object_permissions(self.request, obj)
            return obj
        else:
            return super(BreedingViewSet, self).get_object()

    def create(self, request, *args, **kwargs):
        if request.data.get('id'):
            return super(BreedingViewSet, self).update(request, *args, **kwargs)
        else:
            return super(BreedingViewSet, self).create(request, *args, **kwargs)
like image 2
Vaibhav Jain Avatar answered Nov 07 '22 05:11

Vaibhav Jain