升级到Django 1.7后,关系不存在

时间:2017-01-20 16:30:36

标签: model 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"
    ...

修改

作品! 太棒了,我只需添加" admin_castingprofile"而不是" castprofile"在db_table中遵循e-satisf的最后建议。 运行我的数据库给了我表的名称。

1 个答案:

答案 0 :(得分:0)

问题来自:

label = "Our Admin"

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

由于您之前可能有一个包含此数据的表,因此应保留其先前的名称。我猜这里的名字是“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”用于标签。然后,对于此应用程序的每个模型,声明一个显式表名:

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

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