Django 模型继承 - 如何为父属性设置值

Django model inheritance - How to set value for parent attribute

有两个模型,父模型和子模型,我想设置子模型继承的属性之一的值。

例如,在下面的代码中,将在创建 RedCat 对象时设置颜色属性。

# Parent class
class Cat(models.Model):
    name = models.CharField(max_length=10)
    color = models.CharField(max_length=10)

    class Meta:
        abstract = True

# Child class
class RedCat(Cat):
    color = 'red' # <-- Doesn't work!

我正在考虑覆盖父属性或只在子属性上使用该属性,但我想知道,是否有 right/better 方法可以在 Django 模型中为继承属性设置默认值?

首先,在django中作为parent的child的描述,我认为不是通过subclassing parent class.

相反,如果 RedCatCat 的 child,您应该创建一个新模型,该模型的 ForeignKey 字段旨在 [=12] =]模块。

我认为你的意思是为字段设置 default 值,这可以通过在字段上使用 default 属性来完成。

Models.py

class Cat(models.Model):
    ...

class RedCat(models.Model):
    cat = models.ForeignKey(Cat, on_delete=models.CASCADE)
    color = models.CharField(
        max_length=10,
        default='red',
        )

您可以 link 使用 ForeignKey 然后覆盖子项中的父字段值。

models.py

# Parent class
class Cat(models.Model):
    name = models.CharField(max_length=10)
    color = models.CharField(max_length=10)

# Child class
class RedCat(Cat):
    color_type = models.ForeignKey(Cat, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
       self.color_type.color = "Red"
       self.color_type.save()
       super(RedCat, self).save(*args, **kwargs)

当我第一次提出这个问题时,我很困惑,因为我看不到 /admin 界面中 subclass 中设置的属性值,但代码确实有效。

parent class 是包含属性定义的抽象 class。

child class 正确地继承了这个属性并设置了它的值。

浏览此模型的管理面板时,不会显示该属性的值,因为它是默认设置的并且永远不会更改,但此属性仍然设置正确并且可以从其他任何地方访问。

Django docs on abstract model classes