Django迁移错误:列不存在

Ale*_*lex 19 django postgresql django-models python-3.x

Python 3,Django 1.8.5,Postgres

我有一个Sites一直运作良好的模型.我最近尝试添加字段,airport_code和迁移数据.

class Site(BaseModel):

  objects = SiteManager()

  name = models.CharField(max_length=200, unique=True)
  domain = models.CharField(max_length=200, unique=True)
  weather = models.CharField(max_length=10)
  nearby_sites = models.ManyToManyField('self', symmetrical=False, blank=True)
  users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
  facebook = models.URLField(max_length=200)
  twitter = models.URLField(max_length=200)
  header_override = models.TextField(blank=True)
  email_header_override = models.TextField(blank=True)
  timely_site_tag_id = models.IntegerField()
  timely_featured_tag_id = models.IntegerField()
  timely_domain = models.CharField(max_length=255)
  sitemap_public_id = models.CharField(max_length=255)
  state = models.CharField(max_length=24)
  airport_code = JSONField()
Run Code Online (Sandbox Code Playgroud)

但是,当我跑的时候我遇到makemigrations了一个错误:

django.db.utils.ProgrammingError: column sites_site.airport_code does not exist LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...

当然,这没有意义,因为当我试图在迁移中创建它时,该列显然不存在.

我已经看到很多关于Stack Overflow上的这个错误的问题没有得到解答,或者有一个解决方案来手动创建迁移文件,或者销毁和重建数据库.这不是一个好的解决方案.

Nex*_*xus 14

运行makemigrations后,请务必逐步完成堆栈跟踪.

在我的情况下,我注意到它通过调用一个完全不同的应用程序中的forms.py中包含的Form来跟踪,这恰好调用了我试图为其创建新迁移的模型.

将Forms类从forms.py移动到views.py中可以解决问题.

  • 我遇到了同样的问题(Django 2.1.1),但只是注释掉了对表单中模型的调用。迁移运行后,只需再次取消注释即可。似乎有点错误 - 或者我们是否有理由不从 forms.py 查询模型? (4认同)
  • 这个建议解决了我的问题。我在 forms.py 中调用了一个模型(`GeneralInfo`),例如 `stuff = list(set([(x.uw, x.uw) for x in models.GeneralInfo.objects.all()]))` 。此调用导致与“makemigrations”发生冲突 (3认同)

Ale*_*lex 9

通过在settings.py中注释掉INSTALLED_APPS中的django调试工具栏,我解决了这个错误.我不确定为什么调试工具栏是罪魁祸首,但在我评论之后,我能够运行makemigrations并且migrate没有问题.

希望这有助于某人,因为我花了12个小时试图解决这个问题.

  • 这也发生在我身上,但不幸的是,我没有使用Django工具栏.不知道如何继续...... (6认同)
  • 嘿,这是过去的我。再次遇到这个问题,但你的修复不起作用(偶然发现很有趣)。你也应该和那个女孩分手。2020 年见! (6认同)

the*_*est 8

我也遇到了这个问题,@Nexus 的回答有所帮助。我想我会在这里提供我的具体案例的详细信息,以便更好地说明问题的原因。这对我来说似乎是一个潜在的错误。

我有一个模型Brand如下:

class Brand(BaseModelClass):
    name = CharField(max_length=256, unique=True)
    website = ForeignKey(URL, on_delete=CASCADE, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

python manage.py makemigrations添加Boolean字段后我正在运行,如下所示:

class Brand(BaseModelClass):
    name = CharField(max_length=256, unique=True)
    website = ForeignKey(URL, on_delete=CASCADE, null=True, blank=True)
    trusted = Boolean(default=True)
Run Code Online (Sandbox Code Playgroud)

运行makemigrations命令时,我收到类似于 OP 的错误:

django.db.utils.ProgrammingError: column appname_brand.trusted does not exist
Run Code Online (Sandbox Code Playgroud)

根据@Nexus 的建议,我逐行浏览了堆栈跟踪,假设这不是 Django 的一些核心问题。事实证明,在其中一个应用程序forms.py文件中,我有以下内容:

choices={(str(brand.id), brand.name) for brand in Brand.objects.all()}
Run Code Online (Sandbox Code Playgroud)

解决方案是简单地注释掉该行, run manage.py makemigrations,然后 run manage.py migrate。之后,我取消了该行的注释,所有内容和表单的功能都像以前一样工作。


dar*_*der 7

就我而言,那是因为我设置了unique_together约束。

当我想删除一个字段时,自动生成的迁移尝试在删除unique_together约束之前先删除该字段。

我要做的是在迁移文件手动向上移动migrations.AlterUniqueTogether约束,以便django首先删除约束,然后再尝试删除字段。

我希望这可以帮助某人。