2012-02-09 11 views
0

は、次のコードを考えてみましょう:ジャンゴそのinit関数内からフィールドの名前を取得

class MyManyToManyField(models.ManyToManyField): 
    def __init__(self,*args,**kwargs): 
    field_name = ?!? 
    kwargs["related_name"] = "%(app_label)s.%(class)s." + field_name 
    super(MetadataManyToManyField,self).__init__(*args,**kwargs) 

class MyModelA(models.Model): 
    modelAField = MyManyToManyField("MyModelB") 

class MyModelB(models.Model): 
    pass 

を、私は私のオーバーロードされたinit関数内からフィールドの名前にアクセスするための方法はありますか?私はmodelAFieldのrelated_nameを "MyAppName.MyModelA.modelAField"にしたいと思います。

私はちょうどkwargとして渡すについて考えてきました:

modelAField = MyManyToManyField("MyModelB",related_name="modelAField") 

、その後のinitでそれを使用して:

field_name = kwargs.pop("related_name",None) 
    if not field_name: 
    raise AttributeError("you have to supply a related name!") 

しかし、私は少しよりよい何かを願っています。

ありがとうございました。

答えて

2

前述したように使用することはcontribute_to_class

、フィールドオブジェクトは、それがクラス内の変数に割り当てることができます前に、その__init__関数を呼び出すことによって、インスタンス化する必要があります。

しかし、モデルが構築されている間、Djangoはcontribute_to_classというフィールドでメソッドを探します。それが存在する場合、それは次のように呼び出されます。

new_field.object.contribute_to_class(ModelClass, field_name) 

カスタムフィールドクラスでこのメソッドをオーバーライドする場合は、フィールドがモデルに追加された時点で必要とされるものは何でも初期化を実行することができます。

+0

それはちょうど素晴らしいことです。大好きです! –

+0

これは素晴らしですが、contrib_to_classが_before_ __init __()と呼ばれると、設定した属性は使用できなくなりますか?私はself._fieldName = contrib_name_classに渡されたfield_name引数を設定しようとしました。しかし、私が__init __()からself._fieldNameにアクセスすると、contrib_to_classに設定した値ではなく、一貫してデフォルト値が与えられます。 – trubliphone

+0

ほぼ1年後、このアプリケーションを書き直していますが、同じ問題が発生しました。Ianが正しかったことが分かりました。私はcontrib_to_classの "related_name"引数を次のようにして変更しなければなりません: 'self.rel.related_name =" some_string "+ name' – trubliphone

1

私はこれが可能ではないと思います。オブジェクトMyManyToManyFieldは、変数に代入される前にインスタンス化されるため、何かを賢明にすることはできません。

フィールドと相互作用するモデルのDjangoのメタクラスに同じ魔法があるかもしれません。この相互作用をハイジャックしてそこにロジックを置くことができます。しかし、私はこの時点で推測しているだけです。

+0

ええ、それは私が考えたものです。私は今、実用的な解決策を持っています。それは私を悩ますだけです。それは非常にエレガントではありません。ありがとう。 – trubliphone

1

kwargとして渡すことは面倒ではないようです。

私は、オブジェクトが多くの参照ポインタを持つことができるので、Pythonがインスタンスの名前を決めることができないと思っています。

例:

x = YourClass() 
y = x 

はYOURCLASS 'X' または 'Y' のインスタンスの名前ですか?それともYourClassのインスタンスですか?

+0

私はあなたの意見を取る。しかし、私はアクセスできるDjangoForm固有の属性がいくつかあると思っていました。結局のところ、私はフィールドの名前がフォームクラス内にあることを知っています。 – trubliphone

関連する問題