自定义函数,用于在DRF modelViewSet上执行创建和更新

时间:2016-12-06 15:46:52

标签: python django python-2.7 django-rest-framework

您好,我想在modelviewset中创建一个自定义方法,该方法需要在一个帖子请求中执行保存和更新逻辑。

这是我的breeding.viewsets.py

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

由于上述方法具有更高的抽象级别,因此   实际上提供或执行自动CRUD功能。

现在的问题是我对多个查询没有任何控制权,例如保存对象和在一个帖子请求中更新另一个对象。

e.g

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

我们如何才能实现如此强大的功能?我错过了什么吗?我发现了这个documentation,但我不知道如何实现给定的指令。

更新

这就是我正在寻找的How do I create multiple model instances with Django Rest Framework?

但答案只能save同一模型的单个帖子请求中的多个实例。但我也希望我们可以在单一功能中对不同的模型执行查询。

2 个答案:

答案 0 :(得分:5)

嗯,从评论中看,您希望在创建育种模型时更新一些不相关的模型。这应该很容易。

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

    def create(self, request):
        # do your thing here
        return super().create(request)

答案 1 :(得分:1)

使用此选项可以使用 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)