【问题标题】:Django TastyPie Resource Update ErrorDjango TastyPie 资源更新错误
【发布时间】:2012-08-17 00:26:31
【问题描述】:

我正在使用 JQuery 的移动客户端使用美味的 API 更新 Django 模型。 当我发送 PUT 请求时,我收到 Column 'created' cannot be null 的错误。

“创建”列在我的模型中,要更新,它的类型是

models.DateTimeField(auto_now_add=True).

使用tastepie API 更新时,更新会导致此列设置为null,这会引发错误。

直接使用django表单可以成功更新模型。该错误仅由 API 更新调用引起。不知道可能是什么问题。

我尝试将字段更改为 (default=datetime.datetime.now, editable=False, blank=True) 代替auto_now_add,但它仍然给出了同样的错误。如果有人知道问题出在哪里,请告诉我。

这里是部分资源代码:

class AbcResource(ModelResource):

    def obj_update(self, bundle, request=None, **kwargs):
        logger.debug("Update called")
        res = super(AbcResource, self).obj_update(bundle, request)
        signals.abc_updated.send( sender=request, abc=res.obj, user=request.user )
        return res

这是模型的一部分:

class Abc( models.Model ):
    created = models.DateTimeField(_('created'), auto_now_add=True)

模型没有自定义保存方法。

她的是发送 PUT 请求的代码:

var url = root + "/api/v1/abc/" + selected_abc + "/" + "?user_key=" + user_guid + "&user_name=" + username + "&format=json";
var abc_data = xmlRequest(url, false);
abc_data["field"] = field_value;
var request = $.ajax({
                     url: url,
                     type: 'PUT',
                     contentType: 'application/json',
                     data: JSON.stringify(abc_data),
                     dataType: "application/json",
                     processData: false
                     })
request.done(function(msg) {
             console.log("Status update pass : " + msg);
             });

request.fail(function(jqXHR, textStatus) {
             console.log("Status update fail : " + jqXHR.responseText);
             console.log(jqXHR);
             });

需要更多信息吗?

【问题讨论】:

  • 您能否发布您的资源代码和您正在为其创建资源的模型。
  • 您能否发布更新工作的确切“django 表单”代码...我的意思是我感兴趣的是您是否调用 obj.save() 或其他东西,只是为了知道究竟是什么在尝试找出问题。
  • 更新不是来自 django 表单,而是来自我发布的 javascript 代码。从表单更新工作正常。另外,我没有任何自定义 obj.save() 方法。
  • 您能帮我试试以下方法吗:在调用 super(...).obj_update() 之前的 obj_update 方法中尝试这两个版本:1) bundle['created'] = datetime .datime.now() 2) bundle.created = datetime.datetime.now()
  • 它仍然抛出同样的错误。

标签: django tastypie


【解决方案1】:

你的模型中除了你的 DateTimeField 之外还有其他字段吗?使用 PUT 命令将完全更改您的数据,因此您需要一个完整的条目。 如果要部分更新字段,请尝试 PATCH 命令 http://django-tastypie.readthedocs.org/en/latest/interacting.html#partially-updating-an-existing-resource-patch

【讨论】:

  • 我在尝试 PUT 时确实发送了完整的数据。那么,对于编辑特定记录,我应该使用 PUT 还是 PATCH?
  • 我尝试使用 PATCH 但在调用更新时收到相同的错误。
  • 你能给我们一个完整的例子,说明你的模型、模型资源和发布的数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2015-06-23
  • 2012-07-02
  • 2011-12-02
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多