Django: проблема app_label при объявлении базовых моделей за пределами models.py - PullRequest
1 голос
/ 25 января 2011

У меня есть абстрактный класс Container, который позволяет производным моделям содержать некоторые блоки контента, такие как изображения, текст и т. Д., Которые также являются отдельными моделями.Для чистоты базы данных я хочу, чтобы таблицы для этих моделей были помечены как content_block_image, content_block_text и т. Д.

Но когда я указываю app_label = 'content_block' в мета-классе модели содержимого, я получаю сообщение об ошибке во время syncdb:

content.event: «content» имеет отношение m2m к модели Content, которая либо не была установлена, либо является абстрактной.

Я объявляю следующие базовые классы следующим образом:

# base.py
class Content(models.Model):
    tags = models.TextField(_('tags'), blank=True)
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType, 
                                     related_name='%(class)s_content_set')

    container_type = models.ForeignKey(ContentType)
    container_id = models.PositiveIntegerField()
    container = generic.GenericForeignKey('container_type', 'container_id')

    class Meta:
        app_label = 'content_block'

class Container(models.Model):
    content_type = models.ForeignKey(ContentType, 
                                     related_name='%(class)s_container_set')
    content = generic.GenericRelation('Content', 
                                      content_type_field='container_type', 
                                      object_id_field='container_id')
    class Meta:
        abstract = True

Затем в моих моделях я объявляю модели, которые я называю контейнером:

# models.py
class Event(Container):
    title = models.CharField(max_length=100)
    start = models.DateTimeField()
    end = models.DateTimeField()

Если я удаляю, app_label syncdb запускается без проблем.Кажется, что app_label - это не просто ярлык.

Есть какие-нибудь идеи о том, как добиться этого с помощью app_label для набора базовых классов контента?

1 Ответ

1 голос
/ 25 января 2011

С документ

Если модель существует вне стандартного models.py (например, если модели приложения находятся в подмодулях myapp.models),модель должна определить, в какое приложение оно входит:

app_label = 'myapp'

content_block приложение существует?если нет, то я не уверен, что это сработает.

Кажется, что вы хотите, чтобы заставить имена таблиц.Возможно это свойство будет

Имя таблицы базы данных, используемой для модели:

db_table = 'music_album'

...