2017-01-20 5 views
0

Мне нужно обновить до django 1.7 (тогда 1.8, и т. Д., Но я предпочитаю шаг за шагом). Я на самом деле Django 1.6.11.отношение не существует после обновления до Django 1.7

Мне пришлось внести некоторые изменения в AppConfig, поскольку у меня есть приложение под названием admin с некоторыми моделями внутри.

# apps/admin/apps.py 

from django.apps import AppConfig 

class AdminConfig(AppConfig): 
    name = 'admin' 
    label = "Our Admin" 


# project/settings/common.py 

INSTALLED_APPS = (
    'admin.apps.AdminConfig', # our custom admin 
    ... 

# apps/admin/models.py 

class CastingProfile(models.Model): 

    user = models.OneToOneField(User, primary_key=True) 
    total_casted = models.PositiveIntegerField(default=0) 
    article_price = models.FloatField(default=0.03) 
    ... 

Теперь я эта ошибка, когда я пытаюсь получить доступ к моему пользовательскому администратору:

Exception Type: ProgrammingError 
Exception Value:  
relation "Our Admin_castingprofile" does not exist 
LINE 1: ...t", "Our Admin_castingprofile"."video_price" FROM "Our Admin... 

IPDB:

ipdb> CastingProfile.objects.get(user=user) 
*** ProgrammingError: relation "Our Admin_castingprofile" does not exist 
LINE 1: ...t", "Our Admin_castingprofile"."article_price" FROM "Our Admin... 
                  ^

Должен ли я запустить миграцию для обновления БД или я что-то пропустил?

EDIT:

Я не могу использовать ярлык = "администратор", как из Django 1.7 повторяющегося ярлыка не допускается.

Использование db_table = "your_table_name" приведет к следующей ошибке:

Exception Type: ProgrammingError 
Exception Value:  
relation "castingprofile" does not exist 
LINE 1: ..."last_count", "castingprofile"."article_price" FROM "castingpr... 

А вот модель этого приложения, где я сделал изменения:

# apps/admin/models.py 

class CastingProfile(models.Model): 

    user = models.OneToOneField(User, primary_key=True) 
    total_casted = models.PositiveIntegerField(default=0) 
    article_price = models.FloatField(default=0.03) 
    ... 
    class Meta: 
     db_table = "castingprofile" 
    ... 

EDIT:

Работает! Отлично, мне просто пришлось добавить «admin_castingprofile» вместо «castingprofile» в db_table после последнего совета e-satis. Пробег через мой db дал мне имя таблиц.

ответ

0

Проблема возникает из:

label = "Our Admin" 

Это условие значение Имя таблицы. Вы можете увидеть его в своей последней строке ошибки, где SQL выводит JOIN.

Поскольку у вас, вероятно, раньше была таблица, содержащая эти данные, вы должны сохранить прежнее имя. Я предполагаю, что имя здесь был «админ» так:

class AdminConfig(AppConfig): 
    name = 'admin' # python path to the app module 
    label = 'admin' # unique name for the app. Used for the table 
    verbose_name = 'Our admin' # name you can read as a human 

Если по каким-то причинам вы не можете использовать «Admin» в качестве метки, используйте ярлык, который действительный идентификатор Python, такие как «our_admin» для этикетки. Тогда для каждой модели этого приложения, объявить явное имя таблицы:

class Stuff(models.Model): 
    class Meta: 
     db_table = 'name_of_your_table' 

Вы должны проверить ваш дб, чтобы получить надлежащее имя таблицы для каждой модели, так как они уже созданы. Но делайте это только в том случае, если первый метод не работает.

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