だから私はこのようなモデルを持っています:
class Celebrity(models.Model):
#30+ fields here ...
class HoneyBadger(models.Model):
name = models.CharField(max_length=10)
celebrity_owner = models.ForeignKey(Celebrity)
次に、HoneyBadger の管理インターフェイスに、クリーチャーの名前と有名人の所有者フィールドを表示するようにします。
標準的なアドバイスは、次のようなことです。
class HoneyBadger(models.Model):
name = models.CharField(max_length=10)
celebrity_owner = models.ForeignKey(Celebrity)
def owner_birth_date(self):
return self.celebrity_owner.birth_date
#And so on for every other field in celebrity_owner
そして、管理者でそれらのメソッドを参照します。
代わりに、すべての入力を節約する方法が必要です!
怠惰なショートカットでの私の最初の試みは次のとおりです。
class HoneyBadger(models.Model):
name = models.CharField(max_length=10)
celebrity_owner = models.ForeignKey(Celebrity)
def __getattr__(self, name):
"""Dynamically make derived fields for celebrity_owner fields so I don't have to type out"""
field_lookup_prefix = 'celebrity_owner_field_'
if name.startswith(field_lookup_prefix):
field_name = name[len(field_lookup_prefix):]
def wrapper(*args, **kwargs):
return getattr(self.celebrity_owner, field_name)
return wrapper
else:
raise AttributeError('%s not found' % name)
シェルで実行するとうまくいきますが、Django 管理者は気に入っていません。次のエラーが表示されます。
ImproperlyConfigured at /admin/tracker/
HoneyBadgerAdmin.list_display[5], 'celebrity_owner_field_birth_date' is not a callable or an attribute of 'HoneyBadgerAdmin' or found in the model 'HoneyBadger'.
自分のコードを管理者と連携させる方法を知っている人はいますか? または、有名人のフィールドごとにメソッドを入力するのを節約する別の方法があるかどうかは? (おそらく、ある種のランタイム モンキー パッチ?)