gpt4 book ai didi

Django:如何删除子类对象而不删除父类对象?

转载 作者:行者123 更新时间:2023-12-02 07:14:42 25 4
gpt4 key购买 nike

我有以下模型(为了清楚起见,我省略了 def __unicode__(...)):

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)

我有以下 View 方法,用于使用 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

这一切都很好,但我在 minoresident 表中仍然有一条记录指向具有 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 ,但我希望得到改进的答案。

最佳答案

在 Django 1.10.4+ 上,您可以使用 keep_parents 选项:

minor.delete(keep_parents=True)

否则我建议您使用deletion.Collector进行手动收集:

from django.db.models import deletion

collector = deletion.Collector(using=minor._state.db)
collector.add([minor])
collector.delete()

关于Django:如何删除子类对象而不删除父类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com