我需要升级到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的最后建议。 运行我的数据库给了我表的名称。
答案 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'
您应该检查数据库以获取每个模型的正确表名,因为它们已经创建。但只有在第一种方法不起作用时才这样做。