当前位置: 首页 > 面试题库 >

在Django-Model继承中,是否允许重写父模型的属性?

危钱明
2023-03-14
问题内容

我正在寻找这样做:

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)


 类似资料:
  • 问题内容: 我有一个解决方案,我认为我可以照顾模型继承,但是现在再来看一下,它实际上并不能解决我的问题。我希望能够调用一个模型,然后让我可以访问子模型的字段。对于继承,我仍然必须将子模型名称放在命令行中,这会破坏整个目的。这是我想要的示例: 我想做的是: 并使其运行相应的渲染功能。例如,如果pk与Note模型对齐,则它将仅返回self.id。当然,这简化为我要使用这些功能执行的操作。 我不必使用模

  • 问题内容: 我在想,如果以下迁移是可能的Django的南部和仍然保留的数据。 之前: 我目前有两个应用程序,一个叫做电视,一个叫做电影,每个都有一个VideoFile模型(在这里简化): tv/models.py: movies/models.py: 后: 因为这两个videofile对象是如此相似,所以我想摆脱重复并在一个名为media的单独应用中创建一个新模型,其中包含通用的VideoFile

  • 问题内容: 我想使用数据库模型为我的项目控制一些配置设置。例如: 此模型应该只有一个实例: 当然,如果有人不小心创建了一个新实例,那就不是世界末日了。我可以做。但是,是否有一种方法可以将其锁定,从而无法创建多个实例? 鉴于Django从那时起发生了很大变化,是否有解决此问题的标准方法?还是我应该只使用并接受可能重复的内容? 问题答案: 您可以重写方法以控制实例数:

  • 问题内容: 我知道Java和C#中不允许多重继承。许多书只是说,不允许多重继承。但是可以通过使用接口来实现。没有任何关于为什么不允许它的讨论。谁能确切告诉我为什么不允许这样做? 问题答案: 简短的答案是:因为语言设计师决定不这样做。 基本上,.NET和Java设计器似乎都不允许多重继承,因为他们认为添加MI会增加语言的复杂性,而带来的好处却很少。 要获得更有趣和深入的阅读,Web上提供了一些文章,

  • 将一些常见注释从测试类移动到基本类在Quarkus中不起作用,这是有意的还是我遗漏了什么? 这是有效的: 这不管用: 注释不能应用于子类

  • 问题内容: 我在Django中有一些模型继承级别: 和继承了许多不同的模型。我想创建一个信号,当创建附件时,该信号将更新父工作的字段。认为为父发件人()发出的信号也会在所有继承的模型上运行,这是合乎逻辑的,但事实并非如此。这是我的代码: 有没有办法使此信号对所有继承自其的模型起作用? Python 2.7,Django 1.4 pre-alpha 附言:我已经尝试了在网上找到的一种解决方案,但是它