2015-07-26 4 views
0

У меня есть много классов в models.py что-то вроде:Общих app_label для всех моделей в Django

class SomeClass1(BaseModel): 
    question = models.ForeignKey(Question) 
    image = models.ForeignKey(Image) 

class SomeClass2(BaseModel): 
    question = models.ForeignKey(Question) 
    option_text = models.TextField() 

Теперь я хочу добавить app_label = 'my_app_label1' все эти классы, что-то вроде этого:

class SomeClass1(BaseModel): 
    question = models.ForeignKey(Question) 
    image = models.ForeignKey(Image) 
    class Meta: 
     app_label = 'my_app_label1' 

Но поскольку существует много классов, поэтому вместо добавления app_label = 'my_app_label1' ко всем классам я добавляю app_label = 'my_app_label1' в BaseModel, например:

class BaseModel(models.Model): 
    """ 
    For future abstraction. 
    """ 
    class Meta: 
     app_label = 'ques_app_data' 

После чего я получаю эту ошибку:

myapp.SomeClass1.basemodel_ptr: (fields.E300) Field defines a relation with model 'BaseModel', which is either not installed, or is abstract. 

Может кто-нибудь объяснить, как решить эту проблему?

+0

Соответствует ли имя вашего приложения имени, которое вы передаете в app_label? – Igor

+0

Нет, это не так, но я хочу дать тот же app_label для моделей в разных приложениях. –

+0

Это должно быть то же самое имя, которое включено в настройки, я думаю. Попробуй это. – Igor

ответ

2

Попробуйте указать abstract=True в BaseModel внутренний Meta класс.

class BaseModel(models.Model): 
    """ 
    For future abstraction. 
    """ 
    class Meta: 
     abstract=True # specify this model as an Abstract Model 
     app_label = 'ques_app_data' 

Тогда наследуют этот BaseModel класс в модели классов.

Все классы дочерних моделей наследуют атрибуты класса Meta родительского класса BaseModel. Django выполнит одну настройку, но до класса Meta абстрактного базового класса, перед установкой атрибута Meta в дочернем классе он устанавливает abstract=False. Это делается для того, чтобы дети абстрактных базовых классов автоматически не становились абстрактными классами.

После этого вам нужно будет снова выполнить миграцию.

Примечание: Для этого должно быть приложение в вашем проекте по имени ques_app_data.

+0

Да, я сделал это, но после этого makemigrations не создает таблицы для дочерних классов –

+0

Какая ошибка вы получаете? можете ли вы отправить трассировку –

+0

Ошибка.Нормальное выполнение (без расширения BaseClass) Миграции для «SomeClass1»: 0003_usersubscription2.py: - Создать модель UserSubscription2 Но при расширении BaseClass, я ничего не –

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