1

挿入または更新を実行するWebサービスを作成しようとしています。リクエストは、ヘッダー、テーブル名、列名、各列に設定する値を含む値を含む投稿です。リクエストヘッダーを解析し、パラメーターdictを作成しています。

def handel_request(request): if request.method == "POST":
        param_dict = formParmDict(request)
        ##if insert param_dict["Model"] is {'pk':1,'field1':100,'field2':200}
        ##if update param_dict["Model"] is {'pk':1,'field1':100}
        Model(**param_dict["Model"]).save() ## if update then sets field2 to null
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

これ.save()は、が挿入を実行している間は正常に機能します。更新の場合、つまり、が更新される場合param_dict["Model"]{pk:1, field1:somevalue}、で指定されたフィールド以外の残りのフィールドparam_dict["Model"]がnullに設定されます。何故ですか?私は何か間違ったことをしていますか?指定されたフィールドのみを更新することを想定して保存しませんか?

4

2 に答える 2

2

これはあなたが更新することになっている方法ではありません。

Model(**param_dict["Model"]).save()

同じで新しいインスタンスを作成していますid。代わりにget、インスタンスを作成してから、適切に更新する必要があります。

m = Model.objects.get(id=param_dict['id'])
m.field = param_dict['some_field']
m.save()

または、Managerの更新方法を使用できます。

Model.objects.filter(id=param_dict['id']).update(**param_dict['Model'])

レコードがすでに存在するかどうかわからない場合は、 get_or_createメソッドもあります。

tasty-piedjango-rest-frameworkなどのRESTフレームワークを使用してみると、問題が軽減される可能性があります。

編集:

djangoでどのように機能するかについての簡単な要約。これは、またはが起こっsaveているかどうかについて私が意味したことです。dictにすべてのフィールドの空の値が含まれていない限り、djangoがどのように機能するかをより完全に理解するために、どのように機能するかに関するドキュメントを読んでください。INSERTUPDATEpost_datasave

だから、あなたの場合に起こっていることはこれです:

dict = {'id': 1, 'field1': 'my_value'}
m = Model(**dict)
m.id       # 1
m.field1   # my_value
m.field2   # None (because you haven't set it, it defaults to None
m.save()   # UPDATEs the existing instance with id 1 with ALL of the values of `m`

したがって、値を含むインスタンスを保存していNoneます。getそのため、データベースに保存する前に、すべての正しい値が入力されるように、を実行することをお勧めします。

于 2012-12-26T10:44:10.870 に答える
0

多分あなたはこのようないくつかの関数を使うべきです:

def insert_or_update(param_dict):
    pk = param_dict.get('pk', None)
    if pk:
        Model.objects.filter(pk=pk).update(**param_dict)
    else:
        Model(**param_dict)
        Model.save()
于 2012-12-26T13:52:38.247 に答える