Ale*_*der 7 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()
Run Code Online (Sandbox Code Playgroud)
如何将Company实例转换为Person 1,反之亦然?
假设有人错误地使用人员的详细信息创建了公司实例:
company = Company(name="John Smith", tax_no="<some-ssn-#>")
Run Code Online (Sandbox Code Playgroud)
我想将所有错误的Company对象(本来是人员)转换为Person对象,保留所有相关记录(我将具有FK的模型转换为Partner模型,因此保持相同的partner_ptr值非常重要).我可以这样做:
person = Person(name=company.name, ssn=company.tax_no, partner_ptr=company.partner_ptr)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但是有可能删除不再需要的公司对象吗?删除Company对象也将删除它的父Partner对象(以及与伙伴相关的任何对象,包括新创建的Person对象).
有什么建议?谢谢!
PS:这是一个已部署的系统,其中包含大量数据,无法重新设计整个Partner-Person-Company继承概念.
解决此问题的一种方法是首先Partner为每个等待删除的公司添加一个虚拟对象。之后,您可以将partner_ptr所有不需要的Company实例更新为适当的虚拟合作伙伴实例。最后您可以删除所有公司。
当然,您可以使用South来帮助做到这一点。
更新
做了一些基本测试,这有效。我正在使用 Django 1.2.1。
我已经尝试过了,这是不可能的: In 1 : Company.objects.get(pk=7924) Out 1 : 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1590 次 |
| 最近记录: |