Django - 从现有模型中删除primary_key = True?

时间:2017-10-16 13:09:55

标签: mysql django django-migrations

我有一个表已经迁移到MySQL数据库,其中一个字段有primary_key = True。我意识到这需要不同,我需要删除primary_key = True。我想让Django创建自己的自动递增主键字段(就像你没有指定primary_key一样,它与所有模型一样)。

如果我只是删除primary_key = True,Django会抱怨,因为它无法自动为其新的id字段(现在是主键字段)分配自动增量值。

将此一个字段更改为而不是的最佳方法是primary_key = True?这个特殊的模型在数据库中还没有任何记录,所以我认为我的位置比我在那里有记录要好。我不确定我是否应该放弃桌面并进行迁移,好像它是一张全新的桌子,或者我是否需要采取其他方法?

修改

我实际尝试过的事情:

python manage makemigrations accounting

相关模型名为Invoice,我想将字段inv_num更改为不是主键

Django问道:

You are trying to add a non-nullable field 'id' to invoice without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option:

所以我选择选项1,然后输入1

Django创建了迁移文件,所以我这样做:

python manage migrate accounting

Django抱怨道:

django.db.utils.OperationalError: (1067, "Invalid default value for 'id'")

我的研究表明,这是因为您无法自动为主键字段分配值。

修改2

有问题的模型:

class Invoice(models.Model):
  inv_num = models.CharField(max_length = 144, primary_key = True, verbose_name = 'Invoice Number')
  brokerage = models.ForeignKey(Brokerage, blank = True, null = True, verbose_name = 'Brokerage')
  lot = models.ForeignKey(Lot, on_delete = models.SET_NULL, blank = True, null = True, verbose_name = "Lot")
  vendor = models.ForeignKey(Vendor, on_delete = models.SET_NULL, blank = True, null = True, verbose_name = 'Bill To (Vendor)')
  contact = models.ForeignKey(Contact, on_delete = models.SET_NULL, blank = True, null = True, verbose_name = 'Bill To (Contact)')
  due_date = models.DateField(blank = True, null = True, verbose_name = 'Date')
  fund = models.ForeignKey(Fund, on_delete = models.SET_NULL, blank = True, null = True)
  org_amt = models.DecimalField(max_digits = 12, decimal_places = 2, default = 0, verbose_name = 'Original Amount of Invoice')
  amtos = models.DecimalField(max_digits = 12, decimal_places = 2, default = 0, verbose_name = 'Amount OS')
  is_fine = models.BooleanField(default = False)
  is_reversed = models.BooleanField(default = False, verbose_name = 'Has Been Reversed')
  is_paid = models.BooleanField(default = False, verbose_name = 'Is Paid')
  is_locked = models.BooleanField(default = False, verbose_name = 'Is Locked')
  is_archived = models.BooleanField(default = False, verbose_name = 'Is Archvied')
  org_je = models.CharField(max_length = 144, blank = True, null =True, verbose_name = 'Original JE')

此Django应用程序中有许多其他模型将Invoice作为外键。但是那些在数据库中也没有任何数据。

我想知道我是否应该从数据库中删除整个应用程序,并重新迁移它?我确实有很多其他应用程序,我不能简单地删除数据。

0 个答案:

没有答案