【问题标题】:How can I programmatically obtain the max_length of a Django model field?如何以编程方式获取 Django 模型字段的 max_length?
【发布时间】:2010-12-22 04:50:09
【问题描述】:

假设我有一个类似这样的 Django 类:

class Person(models.Model):
    name = models.CharField(max_length=50)
    # ...

如何以编程方式获取name 字段的max_length 值?

【问题讨论】:

    标签: python django django-models oop


    【解决方案1】:

    Person._meta.get_field('name').max_length 会给你这个值。 但必须使用_meta 表明这是您在正常使用中不应该做的事情。

    编辑:正如 Carl 指出的那样,这个命名具有误导性,使用它似乎完全可以接受:http://www.b-list.org/weblog/2007/nov/04/working-models/

    【讨论】:

    • 好答案,但不同意第二条评论。 _meta 前面的下划线具有误导性,IMO(我已经看到 Django 核心开发人员同意;它的部分原因是为了避免与模型字段的名称冲突)。使用 _meta 不是一种难闻的气味,它是一种很好的气味;这意味着你很干,没有做出无根据的假设。
    • Carl:实际上,您似乎确实同意我的评论,这只是遵守命名约定和这通常具有的含义。你是对的,但它具有误导性:例如参见b-list.org/weblog/2007/nov/04/working-models
    • 过去我发现这个命名很烦人,因为您不能在 Django 模板中访问开头带有下划线的变量。我们添加了一个指向 _meta 的新属性来解决这个问题。
    • 太棒了!我正在使用它来强制执行表单字段的最大长度。
    • 从类外部访问受保护的成员是一种好习惯
    【解决方案2】:

    问题是关于模型的,但对于试图对表单做同样的事情的人(这就是我在这个线程中结束的方式),我认为这种方法非常简单明了:
    1. 在模板中:
    {{form.name.field.max_length}}

    2.在python代码中(例如在视图中)
    form.name.field.max_length

    【讨论】:

    • 不幸的是,问题是关于模型,而不是表单
    • @NathanTregillus 是的,你完全正确,但这就是我结束这篇文章的方式,寻找如何为表单执行此操作。所以我假设其他人最终也会在这里寻找表格的解决方案。我已经编辑了我的答案以澄清这一点。谢谢。
    • 这也是我在这里找到的方式。谢谢,@GinesHidalgo!
    • 我也在这里找到了我的方式,因为我收到了一个表单错误 - 字符串对于该字段来说太长了。我的代码通过 API 导入数据,这样做时,“Two Scoops of Django”建议使用表单来验证传入数据。为避免表单错误,在将数据放入表单之前,我的代码现在对照 max_length 检查传入字符串的长度,并减少过长的字符串。 (无需使字段足够长以容纳过于冗长的传入字符串。)
    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2017-10-24
    • 2018-08-23
    • 2019-06-08
    • 2019-10-19
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多