如何以编程方式获取Django模型字段的max_length?


70

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

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

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

Answers:


98

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

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


10
好的答案,但不同意第二条评论。IMO _meta前面的下划线具有误导性(并且我已经看到Django核心开发人员同意;它的部分存在只是为了避免名称与模型字段冲突)。使用_meta并非难闻的气味,这是一个好气味。这意味着您正在干,并且没有做出不必要的假设。
卡尔·梅耶

卡尔:实际上,您似乎确实同意我的评论,这只是遵守命名约定及其通常的含义。您是正确的,但它具有误导性:例如,请参见b-list.org/weblog/2007/nov/04/working-models
Ben James

我发现这种命名方式过去很烦人,因为您无法在Django模板的开头使用带下划线的变量。我们添加了一个指向_meta的新属性来解决这个问题。
Stephen Paulger

太棒了!我用它来强制表单字段的最大长度。
Furbeenator 2012年

它是一个很好的做法,以获得来自外部的保护成员的类
ASKN

4

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

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


3
不幸的是,问题是关于模型而非形式的问题
Nathan Tregillus

1
@NathanTregillus是的,您是完全正确的,但这就是我在本帖子中的结尾,探讨了如何针对表单执行此操作。因此,我认为其他人也将最终在这里寻找表格的解决方案。我已经编辑了答案以澄清这一点。谢谢。
Gines Hidalgo

1
这也是我在这里找到路的方式。谢谢,@GinesHidalgo!
pdoherty926

我也在这里找到了自己的出路,因为我遇到了表单错误-该字符串对于字段来说太长了。我的代码通过API导入数据,并且这样做时,“ Django的两个瓢”建议使用该表单来验证传入的数据。为了避免表单错误,在将数据放入表单之前,我的代码现在将对照max_length检查传入字符串的长度,并减少太长的字符串。(无需使字段足够长以容纳过于冗长的传入字符串。)
Rick Graves
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.