gpt4 book ai didi

python - Django - 删除对象,保持 parent ?

转载 作者:太空狗 更新时间:2023-10-29 21:53:43 25 4
gpt4 key购买 nike

我有如下多表继承情况:

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 实例转换为 Person 实例,反之亦然?
假设有人错误地创建了一个包含个人详细信息的公司实例:

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

我想将所有错误的 Company 对象(本来应该是 Persons)转换为 Person 对象,保留所有相关记录(我有 FK 到 < strong>Partner 模型,因此保持相同的 partner_ptr 值很重要)。我可以这样做:

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

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

有什么建议吗?谢谢!

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

最佳答案

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

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

更新

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

I have tried this, it's not possible: In 1: Company.objects.get(pk=7924) Out1: In [2]: c.partner_ptr = Partner() In [3]: c.pk In [4]: c.delete() AssertionError: Company object can't be deleted because its partner_ptr_id attribute is set to None. Setting the partner_ptr instance to a dummy one changes the company's PK and it's not the Company.

您必须附加一个新的合作伙伴,然后保存公司。然后您可以安全地删除它。

所以:

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

关于python - Django - 删除对象,保持 parent ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711191/

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