2010-02-20 2 views
2

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

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 для выполнения этих объединений.

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

ответ

0

Таким образом, AreaBlock.block_object является общим фактором для одного из нескольких возможных моделей SomeXXBlock?

Вы имеете в виду, что у каждой записи SomeXXBlock есть запись BlockRegistrar?

Самый простой способ сделать это было бы с model inheritance:

class BlockRegistrar(models.Model): 
    # 'global' fields common to all SomeXXBlock models 
    ... 

class SomeBlock(BlockRegistrar): 
    ... 

class SomeOtherBlock(BlockRegistrar): 
    ... 

За кулисами Django автоматически создает OneToOneField связывающую экземпляр SomeXXBlock на это соответствующее BlockRegistrar. В Django это называется «наследование нескольких таблиц». Из вашего вопроса, похоже, это может быть то, что вы хотите.

Если вам не нужно, чтобы получить доступ к BlockRegistrar объект непосредственно, а просто хотят глобальные поля должны быть доступны на всех моделях SomeXXBlock «ребенок», то вы могли бы использовать Абстрактную базовую модель:

class BlockRegistrar(models.Model): 
    # 'global' fields common to all SomeXXBlock models 
    ... 
    class Meta: 
     abstract = True 

class SomeBlock(BlockRegistrar): 
    ... 

class SomeOtherBlock(BlockRegistrar): 
    ... 

В этом case модель BlockRegistrar не существует в качестве таблицы в db, и нет волшебства OneToOneField, добавленного в модели SomeXXBlock.

Смежные вопросы