То есть AreaBlock.block_object
является GenericForeignKey для одной из нескольких возможных SomeXXBlock
моделей?
Вы имеете в виду, что каждая запись SomeXXBlock
имеет соответствующую запись BlockRegistrar
?
Самый простой способ сделать это - наследование модели :
class BlockRegistrar(models.Model):
# 'global' fields common to all SomeXXBlock models
...
class SomeBlock(BlockRegistrar):
...
class SomeOtherBlock(BlockRegistrar):
...
За кулисами Django автоматически создает OneToOneField, связывающий экземпляр SomeXXBlock
с соответствующим BlockRegistrar
. В Django это называется «наследование нескольких таблиц». От твоего вопроса это звучит так, как будто это то, что ты хочешь.
Если вам никогда не требуется прямой доступ к объекту BlockRegistrar
, а просто требуется, чтобы глобальные поля были доступны во всех SomeXXBlock
«дочерних» моделях, тогда вы можете использовать базовую модель Abstract:
class BlockRegistrar(models.Model):
# 'global' fields common to all SomeXXBlock models
...
class Meta:
abstract = True
class SomeBlock(BlockRegistrar):
...
class SomeOtherBlock(BlockRegistrar):
...
В этом случае модель BlockRegistrar
не существует в виде таблицы в БД, и нет волшебного OneToOneField, добавленного к SomeXXBlock
моделям.