在Django中-模型继承-是否允许您覆盖父模型的属性?


问题内容

我正在寻找这样做:

class Place(models.Model):
   name = models.CharField(max_length=20)
   rating = models.DecimalField()

class LongNamedRestaurant(Place):  # Subclassing `Place`.
   name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
   food_type = models.CharField(max_length=25)

这是我要使用的版本(尽管我可以接受任何建议):http
:
//docs.djangoproject.com/en/dev/topics/db/models/#id7

Django支持吗?如果没有,是否有办法获得类似的结果?


问题答案:

更新的答案:正如人们在评论中指出的那样,原始答案未正确回答问题。
实际上,只有LongNamedRestaurant模型是在数据库中创建的,Place不是。

一个解决方案是创建一个代表“地方”的抽象模型。AbstractPlace,并从中继承:

class AbstractPlace(models.Model):
    name = models.CharField(max_length=20)
    rating = models.DecimalField()

    class Meta:
        abstract = True

class Place(AbstractPlace):
    pass

class LongNamedRestaurant(AbstractPlace):
    name = models.CharField(max_length=255)
    food_type = models.CharField(max_length=25)

还请阅读@Mark答案,他很好地解释了为什么您不能更改从非抽象类继承的属性。

(请注意,这仅在Django 1.10之后才可行:在Django 1.10之前,无法修改从抽象类继承的属性。)

原始答案

从Django
1.10开始,就有可能!您只需要做您要求的:

class Place(models.Model):
    name = models.CharField(max_length=20)
    rating = models.DecimalField()

    class Meta:
        abstract = True

class LongNamedRestaurant(Place):  # Subclassing `Place`.
    name = models.CharField(max_length=255)  # Notice, I'm overriding

Place.name to give it a longer length.
food_type = models.CharField(max_length=25)