6

是否可以使用 TastyPie 将ForeignKey字段更新为None

相关问题:tastepie 不会在 PUT 期间删除外键引用

是)我有的:

class SomeObject(models.Model):
    some_field = models.ForeignKey(SomeOtherObject, null=True)

(当然还有相应的 TastyPie 资源类,可以很好地更新其他字段)

我想要的是:

更新some_fieldNone使用 TastyPie。

我尝试过的(在 JavaScript 中):

$.put('/my/api/model/someobject/42/', { some_field: null });
$.put('/my/api/model/someobject/42/', { some_field: '/my/api/model/someotherobject/null/' });
$.put('/my/api/model/someobject/42/', { some_field: '' });
$.put('/my/api/model/someobject/42/', { some_field: 0 });
$.put('/my/api/model/someobject/42/', { some_field: false });

等等。这些都导致 404 或 400。有些导致 204,但数据库没有更新。

通读 中的代码full_dehydrate(),目前似乎不可能这样做。

在 github 上查看了最近的代码,但我不相信这是可能的。

4

4 回答 4

9

这是一个通用的解决方案。创建一个基础资源并从该资源扩展所有其他资源。这是一个黑客,但它的工作原理。

class MyResource(ModelResource):
    def obj_update(self, bundle, request=None, **kwargs):
        for field_name in self.fields:
            field = self.fields[field_name]

            if type(field) is ToOneField and field.null and bundle.data[field_name] is None:
                setattr(bundle.obj, field_name, None)

        return super(MyResource, self).obj_update(bundle, **kwargs)
于 2012-03-26T14:34:47.967 回答
2

只需为该字段添加一个水合物方法:

def hydrate_some_field(self, bundle):
    some_object = bundle.obj
    some_other_object = bundle.data['some_field']

    if some_other_object == '':
        some_object.some_field = None
        del bundle.data['some_field']

    return bundle

祝你好运!

于 2014-02-14T17:55:45.047 回答
0

对我来说,亚当托马斯的回答是行不通的。我不得不改变 if 条件。

所以总代码变成:

def obj_update(self, bundle, request=None, **kwargs):
    super(MyResource, self).obj_update(bundle, **kwargs)
    field_to_update=[]
    for field_name in self.fields:
        field = self.fields[field_name]
        if field.null and (field_name in request.POST):
            if request.POST[field_name] is u'':
                setattr(bundle.obj, field_name, None)
                field_to_update.append(field_name)
    bundle.obj.save(update_fields=field_to_update)
    return bundle

(注意:我使用 update_field 使 sql 查询更好:))

(顺便说一句:这也适用于 namespacedmodelresources :))

(我无法让它与 return super 调用一起工作,然后它没有为我保存)

于 2014-10-09T05:05:18.370 回答
-1

试试这个:

$.put('/my/api/model/someobject/42/', { some_field: 'None' }); //DOES NOT WORK

我有一个类似的问题,我试图过滤空外键上的一些对象,并能够通过 GET 获取它们:

http://localhost:8000/api/v1/page/?format=json&next_page=None

更新:

虽然我能够通过传递“无”来获取匹配的对象,但它似乎不适用于 PUT。通过此调用,我能够将外键字段更新为 None:

$.ajax('/api/v1/page/1/',{
    contentType: 'application/json', 
    type: 'put', 
    data: JSON.stringify({"next_page": null})
});

我想这可以通过将 null 传递为application/json. 很可能将 null 作为 传递application/x-www-form-urlencoded,但我不知道如何。

顺便说一句,application/json默认情况下,tastepie 的编码是期望的,而application/x-www-form-urlencodedjquery 和其他一些(全部?)库用于 ajax 的编码。也许美味派的默认 json 编码更容易使用。

于 2012-03-15T22:47:38.770 回答