Как удалить объект в отношении django (сохраняя все связанные объекты)? - PullRequest
2 голосов
/ 31 июля 2010

У меня есть следующая модель:

One
   name (Char)

Many
    one (ForeignKey,blank=True,null=True)
    title (Char)

Я хочу удалить Один экземпляр, и все связанные объекты должны потерять свое отношение к Один . На данный момент мой код выглядит так:

one=One.objects.get(<some criterion>)

more=Many.objects.filter(one=one)
for m in more
    m.one=None
    m.save()
#and finally:
one.delete()

что делает код? Он находит объект, который следует удалить, затем ищет связанные объекты, устанавливает для их ForeignKey значение None и, наконец, удаляет экземпляр One . Но где-то в этом процессе ему также удается уничтожить все связанные объекты ( Множество экземпляров) в процессе. У меня вопрос: почему эти связанные объекты удалены и как мне это предотвратить?

Ответы [ 2 ]

2 голосов
/ 01 августа 2010

Код указан правильно. Моя проблема при задании вопроса была опечаткой в ​​моей реализации.

позор мне

хорошо ... есть еще кое-что, что можно улучшить:

more=Many.objects.filter(one=one)
for m in more
    m.one=None
    m.save()
#and finally:
one.delete()

можно записать как:

for m in one.many_set.all()
    m.one=None
    m.save()
one.delete()

, что эквивалентно:

one.many_set.clear()
one.delete()
1 голос
/ 01 августа 2010

Вы можете использовать связку обновлений в первую очередь:

Many.objects.filter(one=one).update(one=None)

Я думаю, что Django удаляет связанный объект на программном уровне (без каскада удаления в СУБД). Так что, вероятно, ваши объекты находятся в каком-то кеше, и Джанго все еще думает, что они связаны с one объектом.

Попробуйте вывести список связанных объектов перед удалением.

print one.many_set
one.delete()

Если у вас все еще есть какие-либо объекты в этом наборе, вам, вероятно, следует снова извлечь one из БД, а затем удалить. Или вы можете использовать команду delete:

One.objects.filter(<cryteria>).delete()
...