2016-12-06 121 views
1

嗨,我想在modelviewset中创建一个自定义方法,它需要在单个发布请求中执行保存和更新逻辑。在DRF模型上执行创建和更新的自定义函数ViewSetSet

这是我的breeding.viewsets.py

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

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

现在,这里的问题是我没有对多个查询像保存一个对象,并在一个单一的POST请求更新另一个对象的任何控制。

e.g

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

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

UPDATE

这是找什么IM的How do I create multiple model instances with Django Rest Framework?

但答案只能save在同一型号的单篇文章请求的多个实例。但我也希望我们可以在单一函数中为不同的模型执行查询。

+0

我不知道您有一个什么问题。您似乎想要重写模型视图集的默认行为,但我不确定您遇到什么问题。您可以通过在视图集中定义create()来覆盖POST方法处理。您可以通过在视图集中定义update()来覆盖PUT方法处理。你也可以在你的序列化程序中定义create()和update()。你究竟想要做什么? –

+0

@MadWombat来澄清我的问题。我需要使用modelviewset添加一个对象并使用单个发布请求更新另一个对象。我想定义一个像create()这样的函数来添加数据并更新其他数据。希望我解释得很好。 –

+0

正确的解决方案取决于您的实际问题。我仍然不知道它是什么。你是否创建了多个相同类型的对象?它们与视图模型的类型相同吗?它们是嵌套的吗?他们有关系吗? –

回答

3

好吧,从评论中看,当你创建你的育种模型时,你想要更新一些不相关的模型。这应该很容易。

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

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

再次提出一个问题,如何从请求中获取特定数据?假设我们提供的数据看起来像这样:{{id:'1',heat:'2'}'。我如何从请求先生获得热量? –

+0

'要求。数据'将包含你发送的数据 –

+0

所以'request.data ['heat']'将包含热量 –

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) 
相关问题