Django复制导致问题的模型对象

时间:2013-11-26 03:02:32

标签: django python-2.7 django-models

我有2个模型,其外键/主键适用于同一型号。

model Foo:
   FK(Too, pk)
model Coo:
   FK(Too, pk)
model Too:
    blah = charfield()

在视图中,我看到一些非常奇怪的行为。我想我做错了。 我想复制Too的一个对象,然后保存它。例如,

too = Too.create(blah="Awesome")
too.save()
foo = Foo.create(too=too)
foo.save()
too.id = None #Copy the original 
too.save()
coo = Coo.create(too=too)
coo.save()
print foo.too.id 
print coo.too.id 
#above 2 print statements give same id

当我检查管理员时,foo和coo都有不同的对象保存。但是,虽然打印它显示相同。为什么会这样。我认为我做的事情从根本上说是错误的。

1 个答案:

答案 0 :(得分:1)

Django查看主键以确定唯一性,因此直接使用它:

too.pk = None
too.save()

将主键设置为None将导致Django执行INSERT,保存模型的新实例,而不是现有实例的UPDATE。

来源:https://stackoverflow.com/a/4736172/1533388

更新:错误,在这种情况下使用pk和id是可以互换的,所以你会得到相同的结果。我的第一个答案没有解决你的问题。

此处的差异介于 python 数据库重构的内容之间。

您的代码导致Django将两个唯一对象保存到数据库,但您只使用一个python Too实例。当foo.save()发生时,创建'foo'的数据库条目时引用第一个Too对象的DB条目。当coo.save()发生时,创建'coo'的数据库条目,指向通过以下方式存储的第二个唯一的Too对象:

too.id = None #Copy the original 
too.save()

但是,在python中,coo和foo都通过各自的'.too'属性引用同名的对象,名为'too'。在python中,只有一个'Too'实例。所以当你更新too.id时,你正在更新一个对象,由coo和foo引用。

仅当从数据库重构模型时(管理视图才能显示它们)是为每个外键创建的唯一实例;这就是管理视图显示两个唯一保存实例的原因。