私はすべての私のモデルは、同様の方法で__str__
方法オーバーライドしたい:Djangoのすべてのモデルで__str__メソッドの一般的な実装を書くには?
class ShowModel(models.Model):
name = models.CharField(max_length=255)
def __init__(self):
self.to_show = 'name'
def _show(self):
if hasattr(self,self.to_show):
return str(getattr(self, self.to_show))
else:
return str(getattr(self, 'id'))
def __str__(self):
return self._show()
class MyModel1(ShowModel):
another_param = models.CharField(max_length=255)
class MyModel2(ShowModel):
another_param = models.CharField(max_length=255)
それは台無し:私は、継承を試してみましたので、私はすべてのモデルで同じコードを繰り返す必要はありません
class MyModel1(models.Model):
name = models.CharField(max_length=255)
def __init__(self):
self.to_show = 'name'
def _show(self):
if hasattr(self,self.to_show):
return str(getattr(self, self.to_show))
else:
return str(getattr(self, 'id'))
def __str__(self):
return self._show()
class MyModel2AndSoOn(models.Model):
another_param = models.CharField(max_length=255)
# same implementation of `__str__` but with another_param
をid
をMyModel1
およびMyModel2
に置き換えて、id
をShowModel
へのポインタで置き換えることによって計算される。継承を持たない私のモデルに__str__
メソッドの共通実装を書く方法、またはShowModel
クラスをDjangoモデルとして扱うのを防ぐ方法は?
UPD: alecxe示唆したように私はabstract
モデルを使用しますが、エラーメッセージが表示されて終わった:私は私のモデルオブジェクトのname
フィールドに値を割り当てる場合はすべてが正常に動作しますUPD
in _show
return str(getattr(self, self.to_show))
File "/path/to/my/project/env3/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 188, in __str__
model = self.model
AttributeError: 'CharField' object has no attribute 'model'
。ソリューション全体:テストケースで
class ShowModel(object):
to_show = 'name'
def _show(self):
if hasattr(self,self.to_show):
return str(getattr(self, self.to_show))
elif hasattr(self,'id'):
return str(getattr(self, 'id'))
else:
return str(self)
def __str__(self):
return self._show()
class Meta:
abstract = True
class MyModel1(ShowModel):
name = models.CharField(max_length=255)
to_show = 'name'
class MyModel2(ShowModel):
another_param = models.CharField(max_length=255)
to_show = 'another_param'
:
ua = MyModel1()
ua.name = 'hi'
print(ua)
#prints hi
ub = MyModel2()
ub.another_param = 'hi again'
print(ub)
#prints hi again
これは予想外に簡単な答えでした。しかし、それは次のエラーを出しました:Upd質問。 –
私のクラスには属性 'show'がありません。 'to_show'を実行すると' hasattr(self、 'to_show') 'は' MyModel1'または 'ShowModel'に' to_show'属性があるかどうかをチェックしますが、 'MyModel'か' ShowModel'の値が ' to_show'すなわち 'name'属性 –
しかし、とにかくソリューションに感謝します! –