删除对象,保持父母?

我有以下多表继承的情况:

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-#>")

我想将所有错误的公司对象(即人员)转换为Person对象,保留所有相关记录(我的模型与FK一起存放在合作伙伴模型中,因此保持相同的partner_ptr值很重要)。 我可以做这样的事情:

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

到目前为止这么好,但是有可能删除不再需要的公司对象吗? 删除Company对象也会删除它的父Partner对象(以及任何与合作伙伴相关的对象,包括新创建的Person对象)。

任何建议? 谢谢!

PS:这是一个已经部署的系统,里面有大量的数据,不可能重新设计整个Partner-Person-Company继承概念。


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

当然,你可以用South来帮助做到这一点。

更新

做了一些基本的测试,并且工作正常。 我正在使用Django 1.2.1。

我试过了,这是不可能的:在1:Company.objects.get(pk = 7924)Out1:In [2]:c.partner_ptr = Partner()In [3]:c.pk In [4]:c .delete()AssertionError:公司对象无法删除,因为它的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()
链接地址: http://www.djcxy.com/p/47843.html

上一篇: deleting object, keeping parent?

下一篇: Deadlock caused by SELECT JOIN statement with SQL Server