直接访问和保存模型对象,而不使用django rest框架

时间:2015-12-22 01:42:27

标签: django django-models django-rest-framework

我为我的一个名为“creative”的资源创建了一个api端点。但是,我需要执行一个操作来实现此资源的暂停和启动(以更改名为status的字段)。因此,我为上述操作创建了一个@detail_route()。

我想要实现的目标:我需要更新此特定资源(模型)Creative的字段以及其外键为此模型的另一个模型的字段。

我在这个@detail_route()方法中调用了一个自定义函数toggleAdGroupState,我直接使用django模型而不是使用序列化器。这是允许的吗?这是实现我需要做的事情的正确方法吗?

class CreativeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Creative
        fields = ('__all__')

@detail_route(methods=['post','get','put'])
    def startcreative(self, request, pk=None):
        try:                
            creative_object= self.get_object()
            creative_object.active_status=Creative._STATUS_ACTIVE
            creative_object.save()              
            toggleAdGroupState(creative_object.id,"active")
        except Exception as e:
            print 'error is ',str(e)
            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return Response(status=status.HTTP_200_OK)

def toggleAdGroupState(creative_id,toggleFlag):     
    adgroup_obj = AdGroup.objects.filter(creative=creative_id)
    for item in adgroup_obj:            
        if(toggleFlag == 'active'):
            item.userActivate()
        else:
            item.userInactivate()

djangorestframework是3.2.2

1 个答案:

答案 0 :(得分:0)

我相信正在遵循这些步骤

  1. 用户点击进行发布/置位请求。
  2. 此请求来自
  3. 的active_status
  4. 模型广告素材接下来您要更新其他模型。
  5. 您可以针对每种方法进行此类操作。我已经展示了put

    class View(generics.UpdateAPIView):
     ....
     def update(self, request, *args, **kwargs):
        # update creative model
        response = generics.UpdateAPIView.update(self, request, *args, **kwargs)
        if response.status == 200: 
          # update_another_model()