【问题标题】:Django model inheritance - How to set value for parent attributeDjango 模型继承 - 如何为父属性设置值
【发布时间】:2020-05-13 18:16:35
【问题描述】:

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

例如,在以下代码中,颜色属性将在创建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!

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

【问题讨论】:

    标签: python django python-3.x django-models django-3.0


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

    • @Berbus,如果这有帮助,请告诉我。
    • 我正在测试一些东西。因此,您的回答和 Ameya 的承诺让我意识到这里实际发生了什么。首先,我错过了父类必须是抽象的,因此不会为其创建表并且不可能生成外键。然后,当我意识到正在设置属性的“默认值”时,我正在使用 save 方法,当我在 /admin 界面中导航表时它不会显示,但它可以在其他任何地方访问。我会更新问题以更好地解释它。谢谢您的回答! ;)
    【解决方案2】:

    首先,django中作为父类的子类的描述,我认为不是通过子类化父类。

    相反,如果RedCatCat 的子级,您应该创建一个新模型,该模型具有指向Cat 模块的ForeignKey 字段。

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

    模型.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',
            )
    

    【讨论】:

      【解决方案3】:

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

      父类是一个包含属性定义的抽象类。

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

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

      Django docs on abstract model classes

      【讨论】:

      • 如果有人在这里绊倒,get_change_form_initial_data 将允许您在管理员中查看创建时的值,但仅适用于管理员,而不是在您保存其他位置时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2019-11-17
      • 2017-05-26
      相关资源
      最近更新 更多