2009-04-17 14 views
1

私はSatchmoとDjangoを使用しており、SatchmoのProductモデルを拡張しようとしています。 Satchmoの製品モデルのフィールドの1つにSatchmoのソースコードを変更せずに管理者にデフォルト値を設定したいと思います。ここではサッチモの製品モデルの簡略バージョンは次のとおりです。Pythonでのクラスメンバー変数のオーバーライド(Django/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) 

これは動作しません、なぜ上の任意のアイデア?

答えて

1

2つの理由から、まずクラス変数をオーバーライドする方法は、Pythonでどのように動作するかではありません。 def __init__(self):がスーパークラスの初期化子をオーバーライドしているのと同じように、通常のようにクラス内で定義するだけです。しかし、Djangoモデルの継承は単にこれをサポートしていません。制約を追加する場合は、save()メソッドで制約を追加できます。

-2

サブクラスからスーパークラスを変更することはできません。

あなたはソースがあります。転覆を使う。変更を加えます。 Satchmoが更新されたら、変更を反映した更新をマージします。あなたが本当にしたかった場合は、おそらくそれをモンキーパッチでき

1

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

しかし、これは厄介な習慣ですし、問題を引き起こす可能性があります。間違いなくSatchmoのソースを直接パッチするだけの場合に比べて維持管理が容易ではありません。

関連する問題