0

コード:

モデル:

class Machines(models.Model):
    name = models.CharField(max_length=100, verbose_name="hostname", help_text="Host name of the machine")
    ip_addr = models.CharField(max_length=50, primary_key=True, help_text="IP address of the machine")
.... have many other fields.

フォーム: forms.ModelForm を使用してフォームを作成する

意見:

def save(request):
if request.method == "POST":
        ip = request.POST.get("ip")
        machine = get_object_or_404(Machines, ip_addr=ip)
        form = MachineForm(instance=machine, data=request.POST)
        if form.is_valid():
            if form.has_changed():
                form.save()
                context = {"message": "Updated successfully"}
            else:   
                context = {"message": "No data to update"}
    return render_to_response("edit.html", context, context_instance=RequestContext(request))

「名前」フィールドを変更すると、 form.save() は現在のオブジェクトを適切に更新します。しかし、主キーである「ip_addr」フィールドを変更すると、form.save() は古い主キーを持つエントリと新しい主キーを持つエントリを 2 つ作成します。

MySQL で同じことを行う場合 (ところで、MySQL を DB として使用しています)

update machines_table set ip_addr="10.1.1.1" where ip_addr="10.1.1.2";

正常に動作し、重複するエントリはありません。

助けてください。

4

1 に答える 1

0

あなたがしているのは秘密鍵を更新することです。この場合、Djangoは新しいインスタンスを作成します。これは、実際にはDjangoがレコードをコピーする方法です。INSERTnotクエリはUPDATEORMによって実行されます。

コードを次のように変更した場合:

class Machines(models.Model):
    …
    ip_addr = models.CharField(max_length=50, unique=True, …
    …

主キーは変更されないため、Djangoは編集アクションを正しく解釈します。

次回django-debug-toolbarは、DjangoORMによって実行されるクエリを確認するために使用します。

于 2012-12-07T10:20:04.477 に答える