以下の更新を参照してください
私の問題に短いタイトルを付ける方法さえ知りません。
クラスには、クラスのクラス属性がいくつかありますStringField
。
class Authors(Table):
# id field is already present
first_name = StringField(maxLength=100)
last_name = StringField(maxLength=100)
StringField
コンストラクターは、 という引数を受け取る場合がありますname
。指定されていない場合は、クラス属性の名前 (上記first_name
のlast_name
例では ) と同じにする必要があります。
作成されたインスタンスが割り当てられる変数の名前を抽出することは可能ですか? inspect
モジュールを使用する必要があると思いますか?
私はDjangoがこれを行うのを見ます:
ForeignKey、ManyToManyField、および OneToOneField を除く各フィールド タイプは、オプションの最初の位置引数 (詳細な名前) を取ります。詳細な名前が指定されていない場合、Django はフィールドの属性名を使用して自動的に作成し、アンダースコアをスペースに変換します。
この例では、詳細な名前は「person's first name」です。
first_name = models.CharField("person's first name", max_length=30)
この例では、詳細な名前は「名」です。
first_name = models.CharField(max_length=30)
しかし、Django 1.3.1 のソース コードには、必要なことを行っている部分が見つかりません。
アップデート:
単純化するには:
class Field():
def __init__(self, field_name=None):
if not field_name:
field_name = ??? # some magic here to determine the name
print(field_name)
class Table():
first_name = Field()
last_name = Field()
これを実行すると、印刷さfirst_name
れ、last_name
解決策:
class Field():
def __init__(self, name=None):
self._name = name
class Table():
first_name = Field()
last_name = Field()
for attrName, attr in Table.__dict__.items():
if isinstance(attr, Field):
if attr._name is None:
attr._name = attrName
print(Table.first_name._name)
print(Table.last_name._name)