У меня есть следующие модели (я ушел из def __unicode__(...)
для ясности):Django: Как удалить объект дочернего класса без удаления объекта родительского класса?
class Person(models.Model):
first_name = models.CharField(max_length=64, null=True, blank=True)
middle_name = models.CharField(max_length=32, null=True, blank=True)
last_name = models.CharField(max_length=64, null=True, blank=True)
class MinorResident(Person):
move_in_date = models.DateField(null=True)
move_out_date = models.DateField(null=True)
natural_child = models.NullBooleanField()
class OtherPerson(Person):
associate_all_homes = models.BooleanField(default=False)
У меня есть следующий метод просмотра для использования объекта MinorResident создать OtherPerson объект, как:
def MinorToAdult(request, minor):
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson(p.id)
o.__dict__.update(p.__dict__)
o.save()
return True
Этом все отлично работает, но у меня все еще есть запись в таблице миноризаций, указывающая на запись человека с person_ptr_id. У меня также есть запись указателя в таблице otherperson с тем же person_ptr_id, указывающим на одного и того же человека, и отображением всех данных, как это было до коммутатора, но с объектом OtherPerson вместо объекта MinorResident. Итак, я хочу удалить объект MinorResident, не удаляя объект Person родительского класса. Я полагаю, что я могу сделать что-то вроде:
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson()
o.__dict__.update(p.__dict__)
o.save()
minor.delete()
return True
Но я хотел бы, чтобы не иметь новую запись в таблице Person, если я могу помочь ему, так как он на самом деле не новый человек, просто человек, которого взрослый сейчас. Может, я смогу сделать что-то подобное? Или есть лучший способ справиться с модельной трансмутацией?
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson(p.id)
o.__dict__.update(p.__dict__)
o.save()
minor.person_ptr_id = None
minor.delete()
return True
Я смотрел на SO #3711191: django-deleting-object-keeping-parent, но я надеялся на улучшение ответа.
Жаль, что я видел это еще в марте 2012. Я в конечном итоге решил это так, как вы описали, объединив несовершеннолетних и взрослых как объекты-резиденты, с указанием даты рождения, чтобы определить взрослую жизнь. И да, я переключился так, что движение и выход - часть отношений, а не человека. – Furbeenator
Как и в Django 1.9, ответ прост, как Foo.delete (keep_parents = True) – kert
Обратите внимание, что delete (keep_parents = True) будет досадно удалять из моделей с внешними ключами в родительскую модель. – MrDBA