我在stackoverflow和google上读了很多其他的帖子,但是我找不到解决方案。
这一切都始于我将模型从CharField更改为ForeignKey。我收到的错误是:
Operations to perform:
Synchronize unmigrated apps: gis, staticfiles, crispy_forms, geoposition, messages
Apply all migrations: venues, images, amenities, cities_light, registration, auth, admin, sites, sessions, contenttypes, easy_thumbnails, newsletter
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying venues.0016_auto_20160514_2141...Traceback (most recent call last):
File "/Users/iam-tony/.envs/venuepark/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.IntegrityError: column "venue_city" contains null values
字符串
我的模型如下:
class Venue(models.Model):
venue_city = models.ForeignKey(City, null=True,)
venue_country=models.ForeignKey(Country, null=True)
型
venue_country之前不存在,因此迁移成功。但venue_city是CharField。
我对我的迁移文件做了一些修改,以便它可以执行SQL,如下所示:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('venues', '0011_venue_map_activation'),
]
migrations.RunSQL(''' ALTER TABLE venues_venue ALTER venue_city TYPE integer USING venue_city::integer '''),
migrations.RunSQL(''' ALTER TABLE venues_venue ALTER venue_city RENAME COLUMN venue_city TO venue_city_id '''),
migrations.RunSQL(''' ALTER TABLE venues_venue ADD CONSTRAINT venues_venus_somefk FOREIGN KEY (venue_city_id) REFERENCES cities_light (id) DEFERRABLE INITIALLY DEFERRED'''),
型
先谢谢你了!
更新:我的新迁移文件:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cities_light', '0006_compensate_for_0003_bytestring_bug'),
('venues', '0024_remove_venue_venue_city'),
]
operations = [
migrations.AddField(
model_name='venue',
name='venue_city',
field=models.ForeignKey(null=True, to='cities_light.City'),
),
]
型
8条答案
按热度按时间rsl1atfo1#
看起来您在创建迁移文件后添加了
null=True
。因为venue_city
在您的迁移文件中不是可空字段请遵循下列步骤。
字符串
它应该工作
brjng4g32#
有一个类似的问题,我解决了它删除以前的迁移文件。没有技术解释
tez616oj3#
我只是将
null = True
添加到导致问题的(自动生成的)迁移文件和模型中,就解决了这个问题。然后再次添加migrate
,失败的迁移现在就成功了。因为您也在模型中更改了它,所以makemigration
在此之后不会检测到任何更改。xn1cxnb44#
按以下步骤操作:
无需删除表或从迁移表中删除迁移
e7arh2l65#
我在下面解决了它:
1.首先删除最后迁移面临的问题
1.然后添加
venue_city = models.CharField(blank=True, null=True)
1.最后使用
makemigrations
和migrate
命令r55awzrz6#
正如错误所说,在“venue_city”列中有一个空值。
在定义模型时,似乎没有包含“null=True”。
所以它返回null,因为'venue_city'变量中没有任何内容。考虑删除最后一个迁移文件,然后使用
python manage.py makemigrations
和python manage.py migrate
命令执行另一个迁移。rpppsulh7#
已创建迁移,但在运行过程中失败。请删除最后一个迁移。
修改模型定义,如果你想让它在数据库中允许null,可以添加null=True,default=None。当你在现有表中添加列时,你需要提供任何默认值。
再次重新生成迁移(manage.py makemigrations venues)并迁移(manage.py migrate venues)。
iugsix8n8#
您可能需要打开迁移0016_auto_20160514_2141并在其中分配一些默认值。