0

有两个模型的旧代码如下所示:

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 已经被其他表引用并且也被其他系统使用。

任何建议将被认真考虑。

4

1 回答 1

0

如果您使Fruit模型抽象,它应该可以工作:

class Fruit(models.Model):
    name = models.CharField(max_length=64, default='Unnamed Fruit')
    is_allegic = models.BooleanField(default=False)
    use_by = models.DateTimeField()

    class Meta:
        abstract = True

使其抽象意味着您必须在使用它之前对其进行子类化。这允许您在子类上设置主键。

于 2016-08-04T02:47:46.310 回答