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

标签 django django-models

我正在处理一些 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/

相关文章:

python - Django 文档不工作

django - 限制 Django 表中的行数

python - Django有序序列模型设计

javascript - 在 iframe 上设置 opener 属性

python - 如何以编程方式更改 django 中用户的用户名和密码?

django - 为什么我的静态文件没有被加载?

python - 错误 : didn't return an HttpResponse object. 它返回 None

django - 默认创建非事件用户(is_active default False)

python - 保存模型时去除空格

python - 如何检查数据库中是否存在对象,然后将其插入到django中的表单中