Django - 删除对象,保留父? [英] Django - deleting object, keeping parent?
问题描述
我有以下多表继承情况:
从django.db导入模型
类合作伙伴(models.Model):
#此模型包含公司和个人的通用数据
code = models.CharField()
name = models.CharField()
类人(合伙人):
#一些个人资料
ssn = models.CharField()
class公司(合作伙伴):
#some公司特定数据
tax_no = models.CharField()
如何转换公司实例到人一个,反之亦然?
假设有人错误地创建了一个公司实例与人的详细信息:
company = Company(name =John Smith,tax_no =< some-ssn - #>)
我想将所有错误的公司对象(意在成为人员)转换为 对象,ke取消所有相关记录(我有FK的模型到合作伙伴模型,因此保持相同的 partner_ptr 值很重要)。我可以这样做:
person = Person(name = company.name,ssn = company.tax_no,partner_ptr = company .partner_ptr)
到目前为止这么好,但是可以删除公司<强>不再需要的对象删除公司对象也将删除其父级合作伙伴对象(以及与合作伙伴相关的任何内容,包括新创建的 Person 对象)。 p> 任何建议?谢谢! PS:这是一个已部署的系统,其中包含大量数据,不可能重新设计整个Partner-Person-Company继承概念。 > 有一个方法是首先添加一个虚拟的 当然,您可以使用 South 帮助这个。 更新 做了一些初步的测试,这个工作。我正在使用Django 1.2.1。 我已经尝试过了,这是不可能的:在 1 :Company.objects.get(pk = 7924)Out 1 :在[2]中:c.partner_ptr = Partner()在[3]中:c.pk在[4]中:c.delete()AssertionError:公司对象不能被删除,因为它的partner_ptr_id属性设置为无。将partner_ptr实例设置为虚拟实例会更改公司的PK,而不是公司。 您必须附加一个新的 所以: I have the following multi-table inheritance situation: How can I convert a Company instance to a Person one, and vice-versa? I want to convert all wrong Company objects (that were meant to be Persons) to Person objects, keeping all related records (I have models with FKs to the Partner model, so it's important to keep the same partner_ptr value). I can do something like this: So far so good, but is it possible to delete the Company objects that are not needed anymore? Deleting the Company object will also delete it's parent Partner object (and any related to the partner, including the newly created Person object). Any recommendations? Thanks! P.S.: This is an already deployed system, with lots of data in it and it is not possible to redesign the whole Partner-Person-Company inheritance concept. One way to go about this would be to first add a dummy Of course you can use South to help do this. Update Did some rudimentary testing and this works. I am using 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. You have to attach a new So:
这篇关于Django - 删除对象,保留父?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
合作伙伴
每家公司等待删除。之后,您可以将所有不需要的公司
实例的 partner_ptr
更新到相应的虚拟伙伴实例。最后你可以删除所有的公司。
合作伙伴
然后 >保存 公司。那么你可以安全地删除它。
company = Company.objects.get(pk = 7924)
dummy_partner = Partner(code =dummy,name =dummy)
company.partner_ptr = dummy_partner
company.save()
company.delete()
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()
Let's say someone mistakenly created a Company instance with person's details:company = Company(name="John Smith", tax_no="<some-ssn-#>")
person = Person(name=company.name, ssn=company.tax_no, partner_ptr=company.partner_ptr)
Partner
per each company awaiting deletion. After that you can update the partner_ptr
of all unwanted Company
instances to the appropriate dummy partner instance. Finally you can delete all the companies.
Partner
and then save the company. Then you can safely delete it.company = Company.objects.get(pk=7924)
dummy_partner = Partner(code = "dummy", name = "dummy")
company.partner_ptr = dummy_partner
company.save()
company.delete()