我知道有一些关于migration / makemigrations命令的线程,但是即使我用flush命令重置整个数据库之后,这些命令都没有解决。
执行迁移后的错误是:
`Exception Type: OperationalError
Exception Value: no such column: geruestproject_billing.id`
奇怪的是,0001.initial.py创建了类,但是通过migrations.AddField添加了该属性。代码发布在
下面initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Billing',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
options={
'verbose_name_plural': 'Rechnungen',
},
),
migrations.CreateModel(
name='Client',
fields=[
('Client', models.AutoField(primary_key=True, serialize=False)),
('Company_Name', models.CharField(blank=True, max_length=50, verbose_name='Firma')),
('Company_Email', models.EmailField(blank=True, max_length=254, verbose_name='Firma Email')),
('Company_Phone', models.CharField(blank=True, max_length=20, verbose_name='Telefon Firma')),
('Company_PostalCode', models.CharField(blank=True, max_length=6, verbose_name='Postleitzahl')),
('Company_City', models.CharField(blank=True, max_length=20, verbose_name='Stadt')),
('Company_Street', models.CharField(blank=True, max_length=20, verbose_name='Strasse')),
('Contact_LastName', models.CharField(blank=True, max_length=50, verbose_name='Nachname')),
('Contact_FirstName', models.CharField(blank=True, max_length=50, verbose_name='Vorname')),
('Contact_Phone', models.CharField(blank=True, max_length=20, verbose_name='Telefon Kontakt')),
],
options={
'verbose_name_plural': 'Kunden',
},
),
migrations.CreateModel(
name='Inventory',
fields=[
('Item', models.DecimalField(decimal_places=2, max_digits=5, primary_key=True, serialize=False)),
('Name', models.CharField(max_length=50)),
('Price', models.DecimalField(decimal_places=2, max_digits=7, null=True, verbose_name='Preis in €')),
('Amount', models.IntegerField(default=1000)),
],
options={
'verbose_name_plural': 'Lager',
},
),
migrations.CreateModel(
name='Project',
fields=[
('Project', models.AutoField(primary_key=True, serialize=False)),
('Project_Amount', models.IntegerField(default=10)),
('Item', models.ForeignKey(on_delete='SET_NULL', to='geruestproject.Inventory')),
],
options={
'verbose_name_plural': 'Projekte',
},
),
migrations.AddField(
model_name='billing',
name='invoice_client',
field=models.ForeignKey(default='', on_delete='CASCADE', to='geruestproject.Client'),
),
]
我的模型发布在下面(我删除了不相关的部分)
class Billing(models.Model):
invoice_client = models.ForeignKey(Client, on_delete = 'CASCADE',
blank = False, default = '')
class Meta:
verbose_name_plural = 'Rechnungen'
import random, string
def code_generator(size = 7, chars = string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def save(self, *args, **kwargs):
self.invoice_number = code_generator()
super(Billing, self).save(*args, **kwargs)
谢谢!
答案 0 :(得分:0)
这里给出了类似的解释: https://docs.djangoproject.com/en/2.0/topics/migrations/#dependencies
虽然这里给出的解释是在两个不同的应用程序之间,但 非常相似 符合您的条件:
这意味着当您运行迁移时,作者迁移首先运行,创建ForeignKey引用的表,然后迁移使ForeignKey列在之后运行并创建约束。如果没有发生这种情况,迁移将尝试创建ForeignKey列,而不会引用它所引用的表,并且您的数据库将引发错误。
在您的情况下,结算模型是在客户端模型之前创建的,因此稍后会添加外键。
另请注意,由于您的广告资源模型是在项目模型之前创建的,因此可以在创建项目模特。
这里的问题肯定在于创建表的顺序。随着说:
$ python3 manage.py makemigrations
$ python3 manage.py migrate
那应该可以解决问题。