Django models.py迁移

时间:2018-04-11 23:39:33

标签: django django-models

我知道有一些关于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)

谢谢!

1 个答案:

答案 0 :(得分:0)

这里给出了类似的解释: https://docs.djangoproject.com/en/2.0/topics/migrations/#dependencies

虽然这里给出的解释是在两个不同的应用程序之间,但 非常相似 符合您的条件:

  

这意味着当您运行迁移时,作者迁移首先运行,创建ForeignKey引用的表,然后迁移使ForeignKey列在之后运行并创建约束。如果没有发生这种情况,迁移将尝试创建ForeignKey列,而不会引用它所引用的表,并且您的数据库将引发错误。

在您的情况下,结算模型是在客户端模型之前创建的,因此稍后会添加外键。
另请注意,由于您的广告资源模型是在项目模型之前创建的,因此可以在创建项目模特。

这里的问题肯定在于创建表的顺序。随着说:

  1. 删除迁移包下的所有迁移脚本,但 init .py文件除外。
  2. 删除您正在使用的数据库。
  3. $ python3 manage.py makemigrations
  4. $ python3 manage.py migrate
  5. 那应该可以解决问题。