更改表单中的主键会在DB中创建两个条目,一个使用旧主键,另一个使用新主键



代码:

型号:

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.

形式:使用表单。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))

如果我更改"name"字段,form.save()将正确更新当前对象。但是,如果我更改作为主键的"ip_addr"字段,form.save()将创建两个条目,一个使用旧主键,另一个使用新主键。

如果我们在MySQL中也这样做(顺便说一句,我使用MySQL作为DB)

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

它运行良好,不会有任何重复条目。

你能帮帮我吗。

您正在做的是更新私钥。Django在本例中创建了新实例。这实际上是Django复制记录的方法。由ORM执行INSERT而非UPDATE查询。

如果您将代码更改为:

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

Django将正确解释您的编辑操作,因为主键不会更改。

下次使用django-debug-toolbar查看Django ORM执行了什么查询。

相关内容

最新更新