Django - многотабличное наследование - преобразование родительской таблицы в дочернюю

У меня есть модели, которые выглядят следующим образом:

class Property(Model):
    ...
    class Meta:
        # not abstract

class Flat(Property):
    ...

class House(Property):
    ...

Возможно ли преобразовать уже существующий Property в House или Flat? Я знаю, что дополнительные поля House или Flat находятся в разных таблицах, поэтому это должно быть выполнимо путем создания такой строки и создания некоторого отношения.

Как я могу это сделать?

С помощью пользовательского метода?

class Property(...):

    ...
    def convert_to_house(self):

        # create a house
        house = House.objects.create(
            ...
        )

        # delete current property:
        self.delete()

Создание нового House и удаление Property не является хорошим способом по нескольким причинам. Одна из них заключается в том, что объект Property может быть уже вовлечен в отношения с другими моделями/объектами.

Мне кажется, что это работает:

child = House(property_ptr=property, created=now())
child.save()

В качестве пользовательского действия DRF это выглядит следующим образом:

@action(['POST'], detail=True, url_path='create-child')
def create_child(self, request, pk=None):
    property = self.get_object()
    if property.get_child():
        raise APIException(detail="Blah blah")
    _type = request.data.get('type')

    try:
        ChildModel = Property.get_subtypes_map()[_type]
    except KeyError:
        raise APIException(detail="Blah blah")
    child = ChildModel(property_ptr=property, created=now())
    child.save()
    return Response({'id':child.id})

PS: Вы также должны проверить, есть ли у модели уже какой-либо ребенок.

Вернуться на верх