简体   繁体   English

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

[英]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. 您好我想在modelviewset创建一个自定义方法,该方法需要在单个post请求中执行保存和更新逻辑。

Here is my breeding.viewsets.py 这是我的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. 由于上述方法具有更高的抽象级别并且实际上提供或执行自动CRUD功能。

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. 现在问题是我没有任何控制多个查询,如保存对象和更新单个帖子请求中的另一个对象。

eg 例如

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 UPDATE

This is what im looking for How do I create multiple model instances with Django Rest Framework? 这就是我正在寻找的如何使用Django Rest Framework创建多个模型实例?

But the answer can only save a multiple instances in a single post request of that same model. 但答案只能在同一模型的单个帖子请求中save多个实例。 But Im hoping also that we can perform queries for a different models in that single function. 但我希望我们可以在单一功能中对不同的模型执行查询。

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)

Use this to create or update using POST 使用此命令可以使用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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM