は、次のコードを考えてみましょう:ジャンゴその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!")
しかし、私は少しよりよい何かを願っています。
ありがとうございました。
それはちょうど素晴らしいことです。大好きです! –
これは素晴らしですが、contrib_to_classが_before_ __init __()と呼ばれると、設定した属性は使用できなくなりますか?私はself._fieldName = contrib_name_classに渡されたfield_name引数を設定しようとしました。しかし、私が__init __()からself._fieldNameにアクセスすると、contrib_to_classに設定した値ではなく、一貫してデフォルト値が与えられます。 – trubliphone
ほぼ1年後、このアプリケーションを書き直していますが、同じ問題が発生しました。Ianが正しかったことが分かりました。私はcontrib_to_classの "related_name"引数を次のようにして変更しなければなりません: 'self.rel.related_name =" some_string "+ name' – trubliphone