如何在我的所有模型上自动生成__unicode__方法?

时间:2014-04-18 00:49:13

标签: django django-models

我正在处理一些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表格,我不愿意为这样的小事进行如此大规模的迁移。

1 个答案:

答案 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__