6

TastyPie を使用してForeignKeyフィールドをに更新することはできNoneますか?

関連する質問: PUT 中に Tastypie が外部キー参照を削除しない

私が持っているもの:

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

(そしてもちろん、他のフィールドを更新するために正常に機能する、対応する TastyPie リソース クラス)

私が欲しいもの:

TastyPiesome_fieldを使用するように更新するには。None

私が試したこと(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 に答える
-1

これを試して:

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

Null 外部キーでいくつかのオブジェクトをフィルタリングしようとしていて、GET でそれらを取得できたという同様の問題がありました。

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

アップデート:

「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/jsontaspypie がデフォルトで期待するエンコーディングapplication/x-www-form-urlencodedは、jquery やその他の (すべて?) ライブラリが ajax に使用するエンコーディングです。たぶん、tastypie のデフォルトの json エンコーディングの方が使いやすいでしょう。

于 2012-03-15T22:47:38.770 に答える