首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django,在db级别而不是编程级别上定义额外的模型字段。

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

Stack Overflow用户
提问于 2014-05-01 21:03:59
回答 1查看 84关注 0票数 0

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

代码语言:javascript
运行
复制
class MyClass(models.Model):
    my_field = models.CharField(max_length=50)

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

这可以很好地显示在管理更改列表页面上。但是额外的字段不在db级别。它是在程序设计一级生成的。Django为每个模型对象请求它。

这给我带来了一些麻烦。我的所有管理change list页面具有导出作为excel或其他类型的能力。我正在使用admin查询集来构建该报告。我还有jasper机制,它可以处理SQL选择查询。因此,我想使用queryset来接受这个select查询。

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

是否有一种方法在db级别上定义额外的自定义字段,而不是在Django中定义编程级别的

谢谢你!

编辑过的

将它添加到管理list_filter也是另一个问题,如果它不是一个真正的字段。Django不允许您添加它。

EN

回答 1

Stack Overflow用户

发布于 2014-05-01 21:11:40

您能否创建一个新的数据库字段,然后重写保存方法以填充该字段?我经常这样做,以创建一个标记版本的文本字段。例如:

代码语言:javascript
运行
复制
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)

所以对你来说:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23416569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档