Джанго - удаление объекта, сохранение родителя? - PullRequest
7 голосов
/ 14 сентября 2010

У меня следующая ситуация наследования нескольких таблиц:

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 one и наоборот?
Допустим, кто-то по ошибке создал экземпляр компании с подробностями этого человека:

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

Я хочу преобразовать все неправильные Company объекты (которые должны были быть людьми) в Person объекты, сохраняя все связанные записи (у меня есть модели с FK в Модель Partner , поэтому важно сохранить значение partner_ptr ). Я могу сделать что-то вроде этого:

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

Пока все хорошо, но возможно ли удалить объекты Company , которые больше не нужны? Удаление объекта Company также приведет к удалению его родительского объекта Partner (и любого, связанного с партнером, включая недавно созданный объект Person ).

Есть рекомендации? Спасибо!

P.S .: Это уже развернутая система с большим количеством данных, и невозможно изменить всю концепцию наследования Партнер-Лицо-Компания.

1 Ответ

4 голосов
/ 14 сентября 2010

Один из способов сделать это - сначала добавить фиктивную Partner для каждой компании, ожидающей удаления. После этого вы можете обновить partner_ptr всех нежелательных экземпляров Company до соответствующего фиктивного экземпляра партнера. Наконец, вы можете удалить все компании.

Конечно, вы можете использовать Юг , чтобы помочь сделать это.

Обновление

Сделал некоторые элементарные испытания, и это работает. Я использую Django 1.2.1.

Я пробовал это, это невозможно: In 1 : Company.objects.get (pk = 7924) Out 1 : In [2]: c.partner_ptr = Partner () В [3]: c.pk В [4]: ​​c.delete () AssertionError: Невозможно удалить объект Company, поскольку для его атрибута partner_ptr_id установлено значение None. Установка экземпляра partner_ptr на фиктивный изменяет PK компании, а это не Company.

Вы должны прикрепить новую Partner, а затем сохранить компанию. Тогда вы можете безопасно удалить его.

Итак:

company = Company.objects.get(pk=7924)
dummy_partner = Partner(code = "dummy", name = "dummy")
company.partner_ptr = dummy_partner
company.save()
company.delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...