簡體   English   中英

Django models.py遷移

[英]Django models.py migrate

我知道已經有幾個關於遷移/ 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)

謝謝!

這里給出了類似的解釋: 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

那應該解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM