问题:
当我运行python makemigrations myapp --settings=mysettings
时,它检测到我没有制作的某个模型的更改。也就是说,它会在没有默认值的情况下检测添加到我的模型的“id”字段。因此,它希望我提供一次性默认值。当我这样做,它无法迁移给我一般的错误消息,如in()参数必须是一个字符串或数字,而不是(无论我输入什么,一个整数,一个字符串,一个日期时间,任何一次性的东西)。令人烦恼的是,没有添加ID字段,我不确定为什么会发现这种变化。
Django版本: 1.11
Python版本: 2.7.10
有没有人能解决这个问题? (将根据要求添加更新和更多信息。)
型号: 这是接收随机添加ID的模型。
class Outage(models.Model):
event_start = models.DateTimeField()
event_end = models.DateTimeField()
affected_products = models.ManyToManyField('products.Product')
severity = models.CharField(max_length=50)
summary = models.TextField()
description = models.TextField()
impacted_guests = models.IntegerField()
更新 我执行了 - fake 迁移以避免现在处理此问题,但是在运行测试时,测试数据库出现以下错误:
django.db.utils.OperationalError: (1067, "Invalid default value for 'id'")
它说它需要多对多的id工作,但在我看来它会自动设置并创建存储关系的表,这就是为什么我认为这个错误一开始就发生了。如上所述,在伪造此迁移之后,即使我没有明确设置id,实际应用程序也可以很好地形成多种关系。
问题是,我似乎无法运行任何测试,因为测试数据库需要某种明确的手持设置来正确设置它。以下是有关我的迁移的详细信息:
原始迁移
operations = [
migrations.CreateModel(
name='Outage',
fields=[
('event_start', models.DateTimeField()),
('event_end', models.DateTimeField()),
('severity', models.CharField(max_length=50)),
('affected_products', models.ManyToManyField('products.Product')),
('summary', models.TextField()),
('description', models.TextField()),
('impacted_guests', models.IntegerField()),
],
),
]
第二次迁移:无默认ID(在真实数据库中伪造)
operations = [
migrations.AddField(
model_name='outage',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
]
此迁移文件在运行测试时会产生以下错误。
django.db.utils.OperationalError: (1060, "Duplicate column name 'id'")
如前所述,此版本的第二个迁移文件产生原始结果:
第二次迁移:默认ID(在真实数据库中伪造)
operations = [
migrations.AddField(
model_name='outage',
name='id',
field=models.AutoField(auto_created=True, default=1, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
]
最后,在没有任何第二个迁移文件的情况下运行测试会产生以下结果:
ValueError: "<Outage: Outage object>" needs to have a value for field "id" before this many-to-many relationship can be used.
给出新信息的任何想法?