【问题标题】:Overriding class member variables in Python (Django/Satchmo)在 Python (Django/Satchmo) 中覆盖类成员变量
【发布时间】:2009-04-17 20:54:10
【问题描述】:

我正在使用 Satchmo 和 Django,并且正在尝试扩展 Satchmo 的产品模型。我想让 Satchmo 的 Product 模型中的一个字段在管理员中具有默认值,而无需更改 Satchmo 的源代码。这是 Satchmo 产品模型的缩略版本:

class Product(models.Model):
    site = models.ForeignKey(Site, verbose_name='Site')

这是我试图做的扩展它......

class MyProduct(Product):
    Product.site = models.ForeignKey(Site, verbose_name='Site', editable=False, default=1)

这不起作用,有什么想法吗?

【问题讨论】:

    标签: python django satchmo


    【解决方案1】:

    出于两个原因,首先,您尝试覆盖类变量的方式与它在 Python 中的工作方式不同。您只需在类中正常定义它,就像def __init__(self): 覆盖超类初始化程序一样。但是,Django 模型继承根本不支持这一点。如果要添加约束,可以在 save() 方法中进行。

    【讨论】:

      【解决方案2】:

      如果你真的想的话,你可能会对其进行猴子补丁:

      site_field = Product._meta.get_field('site')
      site_field.editable = False
      site_field.default = 1
      

      但这是一个讨厌的习惯,可能会导致问题;可以说比直接修补 Satchmo 的源代码更难维护。

      【讨论】:

        【解决方案3】:

        您不能从子类更改超类。

        你有来源。使用颠覆。做出改变。当 Satchmo 更新时,合并围绕您的更改的更新。

        【讨论】:

          猜你喜欢
          • 2019-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多