Django - 删除对象,保留父? [英] Django - deleting object, keeping parent?

查看:125
本文介绍了Django - 删除对象,保留父?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下多表继承情况:

 从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继承概念。 >

解决方案

有一个方法是首先添加一个虚拟的合作伙伴每家公司等待删除。之后,您可以将所有不需要的公司实例的 partner_ptr 更新到相应的虚拟伙伴实例。最后你可以删除所有的公司。



当然,您可以使用 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,而不是公司。


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



所以:

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


I have the following multi-table inheritance situation:

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()

How can I convert a Company instance to a Person one, and vice-versa?
Let's say someone mistakenly created a Company instance with person's details:

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

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:

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

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 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.

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 Partner and then save the company. Then you can safely delete it.

So:

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

这篇关于Django - 删除对象,保留父?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆