2015-12-22 56 views
1

我已经创建了一个API端点所说的“创造性”我的资源之一,使用串行。不过,我需要采取措施来实现暂停和启动此资源(更改名为状态的字段)。因此,我为上述操作创建了@detail_route()。访问和保存模型对象直接没有Django的REST框架

我是什么努力实现:我需要更新这个特定的资源(模型)创意的领域,以及它的外键是这个模型的另一个模型的领域。

我打电话的自定义函数toggleAdGroupState这@detail_route内()方法,在那里我直接在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

+0

这是您希望随时更改模型active_status的操作吗?如果是这样,您最好在Creative模型上使用信号或自定义保存方法。 –

+0

不清楚你在问什么。 – DhiaTN

+0

@ KineticStack,@ DhiaTN - 用户将点击一个按钮,该按钮应该切换模型Creative的active_status字段(并更改此广告素材所属的另一个模型AdGroup的字段)。所以我把它和我的detail_route方法绑定在一起,点击按钮会对api端点 -/api/creative//startcreative进行放置或发布请求。 注意:上面的代码实现了我想要的功能。我的问题是这是否是一种可接受的方式(在不使用序列化程序的情况下直接访问django模型)在REST方法下。 – ram

回答

0

我相信有以下步骤

  1. 用户点击后做/放置请求。
  2. 模型创意接下来这个请求active_status要更新的另一种模式。

您可以查看每个方法做这样的。我已经显示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()