0

以下に示す 2 つのモデルの古いコードがあります。

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 がサブクラス モデルのフィールドをオーバーライドすることを許可していないためです。

親モデルの ID はまったく使用されないため、別の AutoField 'base_id' を Fruit モデルに追加しようとしました。しかし、南の makemigrations を実行しようとすると、「django.db.utils.ProgrammingError: relationship "Fruit" already exists」というエラーが表示されます。

すべての 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 に答える