我有以下多表继承情况:
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()如何将公司实例转换为Person one,反之亦然?
假设有人错误地创建了一个包含person详细信息的Company实例:
company = Company(name="John Smith", tax_no="<some-ssn-#>")我希望将所有错误的公司对象(本来是Person)转换为Person对象,保存所有相关记录(我将FKs模型转换为Partner模型,因此保持相同的partner_ptr值很重要)。我可以这样做:
person = Person(name=company.name, ssn=company.tax_no, partner_ptr=company.partner_ptr)到目前为止,还可以删除不再需要的公司对象吗?删除公司对象还将删除它的父合作伙伴对象(以及任何与合作伙伴相关的对象,包括新创建的Person对象)。
有什么建议吗?谢谢!
P.S.:这是一个已经部署的系统,里面有大量的数据,不可能重新设计整个合作伙伴-人-公司继承的概念。
发布于 2010-09-14 17:20:54
要做到这一点,一种方法是首先为每个等待删除的公司添加一个虚拟Partner。之后,可以将所有不需要的Company实例的Company更新为适当的虚拟伙伴实例。最后,您可以删除所有的公司。
当然,您可以使用南来帮助完成这一任务。
更新
做了一些初步的测试,这是可行的。我使用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: 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()https://stackoverflow.com/questions/3711191
复制相似问题