列<column>不存在(Django 1.8)

问题描述 投票:0回答:7

我正在尝试与我的 django 项目的开发服务器进行交互。然而,服务器上的任何页面都会返回相同的错误:

Exception Type: ProgrammingError

Exception Value: column myApp_verb.date does not exist

我最近没有将字段日期添加到模型动词中(它已经存在了一段时间,我不确定是什么导致了这个错误)。我的协作者的本地计算机上都有相同的文件,并且没有人遇到任何问题。

我尝试过各种方法:

我尝试删除日期字段(以及对其的所有引用)。

makemigrations
未检测到任何更改,并且
migrate
失败并出现错误:

django.db.utils.ProgrammingError: column "date" does not exist

我尝试过重命名该字段。再次

makemigrations
没有检测到任何更改,并且迁移失败,并出现与上面相同的错误。

我已尝试删除所有迁移。这没有改变任何事情。

此时我已经没有主意了。任何帮助将不胜感激。

提前致谢!

编辑:这是根据要求的动词类。非常简单:

class Verb(models.Model):
    english_gloss = models.CharField(max_length = 20)
    first_person = models.CharField(max_length = 20)
    second_person = models.CharField(max_length = 20)
    third_person = models.CharField(max_length = 20)
    fourth_person = models.CharField(max_length = 20)
    transitivity = models.BooleanField()
    classifier = models.CharField(max_length = 20)
    inner_lexical = models.CharField(max_length = 20)
    outer_lexical = models.CharField(max_length = 20)
    perfective = models.CharField(max_length = 20)
    imperfective = models.CharField(max_length = 20)
    date = models.DateTimeField(auto_now_add = True)
python django postgresql django-models django-migrations
7个回答
4
投票

您可以创建手动迁移来解决问题。

首先注释掉引发错误的列。

然后编写手动迁移。通常是这样的:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models    

class Migration(migrations.Migration):   

    dependencies = [
        ('my_field', 'last_migration_filename'), # no .py
    ]        

    operations = [
        migrations.AddField(
            model_name='my_model',
            name='my_field',
            field=models.MyField(blank=True, null=True),
        ),
    ]

然后运行

python manage.py migrate
。它将创建那个/那些字段。

然后,取消注释导致错误的字段。

对我来说就像魅力一样。


2
投票

我仍然不知道为什么会出现这个错误,但我的数据库似乎出现了某种损坏。我停用了数据库并启动了一个新数据库,一切都再次完美运行。


1
投票

有同样的问题。我想将字段“slug”添加到城市模型中。

当我用 select_lated('city') 临时注释行时,错误消失了。

for location in Location.objects.filter().select_related('city'):
    cities[str(l.id)] = l.city.id

堆栈跟踪向我指出了代码的平静:

File "/www/loorn/apps/users/widgets.py", line 69, in LocationSelect
    for location in Location.objects.filter().select_related('city'):

1
投票

完全同意 Özer S 的观点。 是的,这是解决这个问题的唯一解决方案。亲爱的 Django 开发人员,为什么当尝试向现有表添加字段时,Django 突然响应该字段不存在?当然不存在,所以我正在尝试添加它!

同样的解决方案适用于我的情况 - 添加具有多项选择的字段:

  1. 这就是 models.py 中添加的字段的样子:

    TEMPLATE = (
      ('list', 'List'), ('table', 'Table')
    )
    template = models.CharField(
        'View template',
        choices=TEMPLATE,
        max_length=7,
        default='list'
    ) 
    
  2. 手动创建一个迁移文件,其编号与上次迁移之后的编号相同。我将“template”字段添加到“blog”应用程序中的“blogcategory”表中,我的迁移文件名为“0005_template”。

  3. 这是迁移文件(0005_template.py)的内容:

    # -*- coding: utf-8 -*-
    from django.db import migrations, models
    
    class Migration(migrations.Migration):
    dependencies = [
        ('blog', '0004_auto_20170628_1533'),
    ]
    
    operations = [
        migrations.AddField(
            model_name='blogcategory',
            name='template',
            field=models.CharField(
                verbose_name='View template',
                choices=[('list', 'List'), ('table', 'Table')],
                max_length=7,
                default='list'
            ),
        ),
    ]
    
  4. 接下来,对模型中的这些行进行评论:

    TEMPLATE = (
      ('list', 'List'), ('table', 'Table')
    )
    template = models.CharField(
       'View template',
       choices=TEMPLATE,
       max_length=7,
       default='list'
    )
    
  5. 然后,在数据库中进行应用程序迁移:

    python manage.py migrate blog
    

    并得到

    Operations to perform:
        Apply all migrations: blog
    Running migrations:
        Applying blog.0005_template... OK
    

因此,具有默认“列表”的“模板”字段被添加到“博客类别”表中的所有条目中。

附注不要忘记取消注释模型中的字段。


0
投票

我也遇到过这个问题。我通过访问数据库中的 Django 迁移表并找到有问题的迁移来修复此问题。就我而言,这是最近的一次迁移。我删除了该迁移以及随后的其他迁移。然后重试运行

python manage.py makemigrations
python manage.py migrate
。这次两个命令都运行并且错误消失了。


0
投票

您通常可以通过“欺骗”django 在生成迁移时认为该列存在来解决此类错误。

  • 在本地数据库中手动创建一个同名的新数据库列
  • 运行
    python manage.py makemigrations
    生成正确的迁移
  • 删除您之前创建的列
  • 运行
    python manage.py migrate 'appname'
    创建新列

0
投票

就我而言,当我第一次使用 models.ForeignKey() 然后更改为 OneToOneFielf() 时,我收到此错误。我刚刚删除了数据库,然后创建了一个全新的数据库,它成功了

© www.soinside.com 2019 - 2024. All rights reserved.