2013-11-26 2 views
0

У меня есть 2 модели с иностранным/основным ключом к той же модели.Django, реплицирующий объект модели, вызывающий проблему

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

Джанго смотрит на первичный ключ, чтобы определить уникальность, поэтому работать с этим непосредственно:

too.pk = None 
too.save() 

Установка первичного ключа None заставит Джанго выполнить INSERT, сохраняете новый экземпляр модели, а не ОБНОВЛЕНИЕ к существующему экземпляру.

Источник: https://stackoverflow.com/a/4736172/1533388

UPDATE: эээ, используя рк и идентификатор являются взаимозаменяемыми в данном случае, так что вы получите тот же результат. Мой первый ответ не затронул ваш вопрос.

Расхождения здесь между тем, что происходит в питона против того, что может быть восстановлено из базы данных.

Ваш код заставляет Django сохранять два уникальных объекта в базе данных, но вы работаете только с одним экземпляром для python Too. Когда происходит foo.save(), запись базы данных для «foo» создается со ссылкой на запись БД для первого объекта Too. Когда coo.save() происходит, запись базы данных для «ворковать» создаются, указывающая на второй, уникальный Too объекта, который был сохранен с помощью:

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

Однако в питоне, как воркует и F относятся к тот же объект, названный «слишком», через соответствующие атрибуты «.too». В python существует только один экземпляр «Too». Поэтому, когда вы обновляете too.id, вы обновляете один объект, на который ссылаются как coo, так и foo.

Только в том случае, если модели были восстановлены из базы данных (как показано администратором для их отображения), это уникальные экземпляры, созданные для каждого внешнего ключа; поэтому в представлении администратора отображаются два уникальных сохраненных экземпляра.

+0

Если я делаю то же самое с «id», он создает новый объект модели. –

Смежные вопросы