Django - 删除对象,保留父级?

时间:2010-09-14 17:05:47

标签: python django multiple-inheritance

我有以下多表继承情况:

from django.db import Models

class Partner(models.Model):
    # this model contains common data for companies and persons
    code = models.CharField()
    name = models.CharField()

class Person(Partner):
    # some person-specific data
    ssn = models.CharField()

class Company(Partner):
    # some company-specific data
    tax_no = models.CharField()

如何将公司实例转换为实例,反之亦然?
假设某人错误地创建了一个包含此人详细信息的公司实例:

company = Company(name="John Smith", tax_no="<some-ssn-#>")

我想将所有错误的公司对象(原本应该是人员)转换为对象,保留所有相关记录(我的模型带有FK到< strong>合作伙伴模型,因此保持相同的 partner_ptr 值非常重要。我可以这样做:

person = Person(name=company.name, ssn=company.tax_no, partner_ptr=company.partner_ptr)

到目前为止一切顺利,但是否可以删除不再需要的公司对象?删除公司对象也会删除其父合作伙伴对象(以及与合作伙伴相关的任何对象,包括新创建的对象)。

有什么建议吗?谢谢!

P.S。:这是一个已部署的系统,其中包含大量数据,无法重新设计整个Partner-Person-Company继承概念。

1 个答案:

答案 0 :(得分:4)

解决这个问题的一种方法是首先为每个等待删除的公司添加一个虚拟Partner。之后,您可以将所有不需要的partner_ptr实例的Company更新为相应的虚拟合作伙伴实例。最后,您可以删除所有公司。

当然,您可以使用South来帮助完成此操作。

更新

进行了一些基本的测试,这是有效的。我正在使用Django 1.2.1。

  

我试过这个,这是不可能的:在1:Company.objects.get(pk = 7924)Out 1:在[2]中:c.partner_ptr = Partner()在[ 3]:c.pk在[4]中:c.delete()AssertionError:无法删除Company对象,因为其partner_ptr_id属性设置为None。将partner_ptr实例设置为虚拟实例会更改公司的PK,而不是公司。

您必须附加新的Partner,然后 保存 公司。然后你可以安全地删除它。

所以:

company = Company.objects.get(pk=7924)
dummy_partner = Partner(code = "dummy", name = "dummy")
company.partner_ptr = dummy_partner
company.save()
company.delete()