我有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都有不同的对象保存。但是,虽然打印它显示相同。为什么会这样。我认为我做的事情从根本上说是错误的。
答案 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引用。
仅当从数据库重构模型时(管理视图才能显示它们)是为每个外键创建的唯一实例;这就是管理视图显示两个唯一保存实例的原因。