我正在处理一些django代码,其中所有模型都有__unicode__
方法,如下所示:
def __unicode__(self):
return str(self.id) + "; " + ", " + self.first_name + " " + self.last_name
(所有情况下的格式为:print self.id
,然后用逗号分隔的其余字段)。清理这种样板的最佳方法是什么?我正在考虑使用MyModel
方法声明__unicode__
类,该方法通过检查列出所有字段,然后让所有当前模型继承自MyModel
而不是当前django.db.models.Model
。但这样做会改变底层的MySQL表格,我不愿意为这样的小事进行如此大规模的迁移。
答案 0 :(得分:6)
正如凯文克里斯托弗亨利建议的那样,你可以创建一个abstract base class并让你的所有模特继承它。这样可以正常工作。
但是,Python支持多类继承。这意味着一个类可以从多个基类继承。有关此主题的更多信息(我建议您阅读,因为它可能很棘手)可以找到here。
通过多类继承,您可以创建一个至少在我看来更清洁的解决方案。您只需创建一个只包含所需代码的类:
class PredefinedUnicodeMixin(object):
def __unicode__(self):
return str(self.id) + "; " + ", " + self.first_name + " " + self.last_name
正如您可能想象的那样,单独使用这个类并不是很有帮助。但试试这个:
class MyModel(PredefinedUnicodeMixin, models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
因为我们首先列出了mixin类,所以它会覆盖其他类中指定的任何属性和方法。
更改__unicode__
方法以迭代字段并不难,self._meta.get_all_field_names()
应包含所有字段名称。
当然,在Python 3上,你应该使用__str__
而不是__unicode__
。