【问题标题】:How to write custom obj_create and obj_update in django tasty pie如何在 django 美味派中编写自定义 obj_create 和 obj_update
【发布时间】:2015-12-12 13:29:59
【问题描述】:

我正在尝试覆盖 Django 美味派中的 obj_create 和 obj_update

class HomeTasksResource(ModelResource):
    class Meta:
        queryset = HomeTasks.objects.filter(is_deleted = False)
        resource_name = 'tasks'
        authorization = Authorization()
        authentication = MyAuthentication()
        excludes = [ 'datetime']
        allowed_methods = ['get','post','put','patch']
        serializer = urlencodeSerializer()
        always_return_data = True
    def obj_update(self, bundle, **kwargs):        
        taskForm = HomeTasksForm(bundle.data,instance = bundle.obj)                 
        if taskForm.is_valid():  

            messages.success(bundle.request,"The task is updated successfully")            
            returnData =  super(HomeTasksResource, self).obj_update(bundle,user = bundle.request.user,id = bundle.obj.id)

            return returnData 

    def obj_create(self, bundle, **kwargs): 

        taskForm = HomeTasksForm(bundle.data)
        if taskForm.is_valid() and bundle.obj is None:    
            messages.success(bundle.request,"The task is successfully added")            
            returnData =  super(HomeTasksResource, self).obj_create(bundle,user = bundle.request.user)                

            return returnData 

上面的方法是有效的,但出于某种奇怪的原因,对于每个更新/放置调用,“create 也被调用”。即对于 put 这两个功能都在运行。我究竟做错了什么 ? 我正在使用 jquery 和最新版本的 sweetpie。

【问题讨论】:

    标签: jquery django tastypie put


    【解决方案1】:

    tastepie 的默认put_detail 视图调用obj_update,但如果找不到对象或无法确定要更新哪个对象,则会回退到obj_create。因此,对于通过 put 的每个新条目,obj_updateobj_create 都会被调用。但是,对于现有条目,理想情况下只应调用 obj_update

    def put_detail(self, request, **kwargs):
        """
        Either updates an existing resource or creates a new one with the
        provided data.
    
        Calls ``obj_update`` with the provided data first, but falls back to
        ``obj_create`` if the object does not already exist.
    
        If a new resource is created, return ``HttpCreated`` (201 Created).
        If ``Meta.always_return_data = True``, there will be a populated body
        of serialized data.
    
        If an existing resource is modified and
        ``Meta.always_return_data = False`` (default), return ``HttpNoContent``
        (204 No Content).
        If an existing resource is modified and
        ``Meta.always_return_data = True``, return ``HttpAccepted`` (200
        OK).
        """
        deserialized = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
        deserialized = self.alter_deserialized_detail_data(request, deserialized)
        bundle = self.build_bundle(data=dict_strip_unicode_keys(deserialized), request=request)
    
        try:
            updated_bundle = self.obj_update(bundle=bundle, **self.remove_api_resource_names(kwargs))
    
            if not self._meta.always_return_data:
                return http.HttpNoContent()
            else:
                updated_bundle = self.full_dehydrate(updated_bundle)
                updated_bundle = self.alter_detail_data_to_serialize(request, updated_bundle)
                return self.create_response(request, updated_bundle)
        except (NotFound, MultipleObjectsReturned):
            updated_bundle = self.obj_create(bundle=bundle, **self.remove_api_resource_names(kwargs))
            location = self.get_resource_uri(updated_bundle)
    
            if not self._meta.always_return_data:
                return http.HttpCreated(location=location)
            else:
                updated_bundle = self.full_dehydrate(updated_bundle)
                updated_bundle = self.alter_detail_data_to_serialize(request, updated_bundle)
                return self.create_response(request, updated_bundle, response_class=http.HttpCreated, location=location)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2012-04-05
      • 2013-03-28
      • 2019-04-07
      相关资源
      最近更新 更多