有两个模型的旧代码如下所示:
class Watermelon(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, default='Unnamed Watermelon')
is_allegic = models.BooleanField(default=False)
use_by = models.DateTimeField()
seedless = models.BooleanField(default=False)
class Pear(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, default='Unnamed Pear')
is_allegic = models.BooleanField(default=False)
use_by = models.DateTimeField()
round_shape = models.BooleanField(default=False)
现在我需要一个通用的水果搜索相关功能,所以我尝试使用模型继承而不干扰旧数据中的原始 ID 号:
class Fruit(models.Model):
name = models.CharField(max_length=64, default='Unnamed Fruit')
is_allegic = models.BooleanField(default=False)
use_by = models.DateTimeField()
class Watermelon(Fruit):
id = models.AutoField(primary_key=True)
seedless = models.BooleanField(default=False)
class Pear(Fruit):
id = models.AutoField(primary_key=True)
round_shape = models.BooleanField(default=False)
这会导致字段“id”的冲突,因为 django 不允许覆盖子类模型中的字段。
我还尝试在 Fruit 模型中添加不同的 AutoField 'base_id',因为根本不会使用父模型中的 ID。但后来我在尝试运行南 makemigrations 时收到“django.db.utils.ProgrammingError:关系“Fruit”已经存在”错误。
我知道重新编号所有 ID 并与所有子类模型共享它们可以解决问题,但我尽量避免使用这种方法,因为这些 ID 已经被其他表引用并且也被其他系统使用。
任何建议将被认真考虑。