【问题标题】:Django - deleting object, keeping parent?Django - 删除对象,保留父母?
【发布时间】:2010-09-14 17:05:47
【问题描述】:

我的多表继承情况如下:

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 = Company(name="John Smith", tax_no="<some-ssn-#>")

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

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

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

有什么建议吗?谢谢!

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

【问题讨论】:

    标签: python django multiple-inheritance


    【解决方案1】:

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

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

    更新

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

    我已经尝试过了,这是不可能的: In 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()
    

    【讨论】:

    • 我已经尝试过了,这是不可能的: 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 而不是公司。
    • @Alexander:查看我的更新答案。您必须在删除之前保存公司。
    • 谢谢你,Manoj,确实在拯救了它工作的公司之后。根据 SQL 日志,它仅从 Company 表中删除:2010-09-14 20:43:49 EEST LOG: statement: DELETE FROM "partners_company" WHERE "partner_ptr_id" IN (7924) 2010-09-14 20: 43:49 EEST LOG:声明:从“partners_partner”中删除,其中“id”在(NULL)
    猜你喜欢
    • 2014-03-02
    • 2014-12-24
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2011-05-24
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多