首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -删除对象,保留父?

Django -删除对象,保留父?
EN

Stack Overflow用户
提问于 2010-09-14 17:05:47
回答 1查看 2.2K关注 0票数 7

我有以下多表继承情况:

代码语言:javascript
复制
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实例:

代码语言:javascript
复制
company = Company(name="John Smith", tax_no="<some-ssn-#>")

我希望将所有错误的公司对象(本来是Person)转换为Person对象,保存所有相关记录(我将FKs模型转换为Partner模型,因此保持相同的partner_ptr值很重要)。我可以这样做:

代码语言:javascript
复制
person = Person(name=company.name, ssn=company.tax_no, partner_ptr=company.partner_ptr)

到目前为止,还可以删除不再需要的公司对象吗?删除公司对象还将删除它的父合作伙伴对象(以及任何与合作伙伴相关的对象,包括新创建的Person对象)。

有什么建议吗?谢谢!

P.S.:这是一个已经部署的系统,里面有大量的数据,不可能重新设计整个合作伙伴-人-公司继承的概念。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,然后保存公司。然后你就可以安全地删除它。

所以:

代码语言:javascript
复制
company = Company.objects.get(pk=7924)
dummy_partner = Partner(code = "dummy", name = "dummy")
company.partner_ptr = dummy_partner
company.save()
company.delete()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3711191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档