Django,在db级别而不是编程级别定义额外的模型字段

时间:2014-05-01 21:03:59

标签: python django

我正在使用Python 2.7Django 1.6.3 我想定义额外的模型字段,它实际上不在db表中。我有一种方法,用property注释定义一个可调用的方法,如;

class MyClass(models.Model):
    my_field = models.CharField(max_length=50)

    @property
    def my_extra_field(self):
        return self.my_field+'extra value'

这可以在管理员更改列表页面上显示它。但额外的字段不在数据库级别。它是在编程级别生成的。 Django要求每个模型对象。

这给我带来了一些麻烦。我的所有管理员change list页面都具有以excel或其他类型导出的功能。我正在使用管理查询集来构建该报告。我还有jasper报告机制,它适用于SQL选择查询。所以,我想使用queryset来获取此选择查询。

我认为能够在db级别定义额外字段对于某些事情很重要。不只是出于我的原因。所以,关于这一点的问题。

有没有办法在Django中的 db级别而不是编程级别上定义额外的自定义字段。

谢谢!。

被修改

如果它不是真正的字段,那么将它添加到admin list_filter也是另一个问题。 Django不允许你添加它。

1 个答案:

答案 0 :(得分:1)

您是否可以创建新的数据库字段,然后覆盖保存方法以填充该字段?我经常这样做来创建文本字段的标记版本。例如:

class Dummmy(models.Model):
    content = models.TextField()
    content_html = models.TextField(editable=False, null=True)

    def save(self, *args, **kwargs):
        self.content_html = markdown(self.content)
        super(Dummmy, self).save(*args, **kwargs)

所以对你:

class MyClass(models.Model):
    my_field = models.CharField(max_length=50)
    my_extra_field = models.CharField(editable=False, null=True)

    def save(self, *args, **kwargs):
        self.my_extra_field = self.my_field + 'extra value'
        super(MyClass, self).save(*args, **kwargs)