升级到 Django 1.7 后关系不存在

relation does not exist after upgrading to Django 1.7

我需要升级到 django 1.7(然后是 1.8 等,但我更喜欢逐步升级)。我实际上是 Django 1.6.11.

我不得不用 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...
                                                               ^

我是否必须 运行 迁移以更新数据库,还是我遗漏了什么?

编辑:

我不能使用 label = "admin" 因为 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"
    ...

编辑:

有效! 太好了,我只需按照 e-satis 的最后建议在 db_table 中添加 "admin_castingprofile" 而不是 "castingprofile"。 运行宁通过我的数据库给了我表的名称。

问题来自:

label = "Our Admin"

此值条件 table 的名称。您可以在最后一个错误行中看到它,其中 SQL 输出 JOIN。

因为您以前可能有一个 table 包含此数据,所以您应该保留它以前的名称。我猜这里的名字是 "admin" 所以:

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" 作为标签。然后对于这个应用程序的每个模型,声明一个明确的 table 名称:

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

您应该检查您的数据库以获得每个模型的正确 table 名称,因为它们已经创建。但只有在第一种方法不起作用时才这样做。