我有一个表已经迁移到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
作为外键。但是那些在数据库中也没有任何数据。
我想知道我是否应该从数据库中删除整个应用程序,并重新迁移它?我确实有很多其他应用程序,我不能简单地删除数据。