моделирование дополнительной табличной информации с типами контента django - PullRequest
2 голосов
/ 20 февраля 2010

Я только начал использовать фреймворк для типов контента Django (и это довольно круто). У меня есть объект Area, который имеет много специализированных объектов Block - я смоделировал его, как показано ниже.

class Area(models.Model):
    ...

class SomeBlock(models.Model):
    ...

class AreaBlock(models.Model):
    area = models.ForeignKey(Area)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    block_object = generic.GenericForeignKey('content_type', 'object_id')

Это работает очень хорошо. Теперь я хочу зарегистрировать эти специализированные блоки в их собственной таблице вместе с дополнительной «глобальной» информацией об этом.

class BlockRegistrar(models.Model):
    ...

Моя проблема - присоединение SomeBlock к его глобальной информации в модели BlockRegistrar. Внешний ключ в таблице блоков был бы очевиден, но он никогда не изменится, и я не могу понять, как использовать таблицу ContentType django для этих объединений.

Любая помощь?

1 Ответ

0 голосов
/ 29 августа 2012

То есть 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 моделям.

...