升级到 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 名称,因为它们已经创建。但只有在第一种方法不起作用时才这样做。
我需要升级到 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 名称,因为它们已经创建。但只有在第一种方法不起作用时才这样做。