在Django-Model继承中,是否允许重写父模型的属性?
我正在寻找这样做:
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)
以上是 在Django-Model继承中,是否允许重写父模型的属性? 的全部内容, 来源链接: utcz.com/qa/423586.html