我正在处理一些 django 代码,其中所有模型都有 __unicode__
方法,如下所示:
def __unicode__(self):
return str(self.id) + "; " + ", " + self.first_name + " " + self.last_name
(所有情况下的格式都是:打印 self.id
,然后用逗号分隔其余字段)。清理此类样板的最佳方法是什么?我正在考虑使用 __unicode__
方法声明一个 MyModel
类,该方法通过检查列出所有字段,然后让我当前的所有模型继承自 MyModel
而不是当前的 django.db.models.Model 。但这样做会改变底层的 MySQL 表,我不想为了这样的小事而进行如此大规模的迁移。
最佳答案
正如 Kevin Christopher Henry 所建议的,您可以创建一个 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__
。
关于django - 如何在我的所有模型上自动生成 __unicode__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145749/