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: Вы также должны проверить, есть ли у модели уже какой-либо ребенок.