为什么Django的URLField默认截断为200个字符?

4

我喜欢Django并经常使用它。我发现它的大多数默认值都很合理,但是有一个一直困扰着我,以至于我在每个项目中都要覆盖它。

URLField模型字段的默认最大长度为200个字符。文档验证了这个限制,但没有解释为什么会这样。

class URLField(CharField):
    ...

    def __init__(self, verbose_name=None, name=None, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 200)
        ...

我进行了覆盖,因为大量的URL超过200个字符,特别是带有查询字符串的URL。

尽管HTTP规范没有指定最大长度,但几乎所有浏览器至少支持2000个字符,这对我来说意味着需要一个新的合理默认值。

好奇地深入挖掘后,我发现第一个添加限制的提交是由@jacobian于2007年1月完成的(#f6390e8);自那以来基本上没有变化。

https://github.com/django/django/blob/f6390e8983dd364053078cc80361cb369b667690/django/db/models/fields/init.py#L805

再回到更早之前,我发现了我认为是将字段类型映射到ORM数据库列类型的代码版本(由@adrianholovaty完成的#f69cf70)。例如,MySQL文件从Django 0.95开始就存在,具有相同的200个字符限制:

https://github.com/django/django/blob/f69cf70ed813a8cd7e1f963a14ae39103e8d5265/django/db/backends/mysql/creation.py#L28


许多URL超过200个字符。您基于哪些研究得出这个结论? - Ignacio Vazquez-Abrams
4
@IgnacioVazquez-Abrams,我没有引用任何特定研究,只是从实践中得出了一些结论。其中一个案例是构建一个具有社交动态的应用程序,该应用程序保存了来自推文的扩展URL。 - Taylor D. Edmiston
1
@IgnacioVazquez-Abrams 如果只有一个URL超过200个字符,那么这就足以说明200个字符是不够的理由。 - GwynBleidD
@Taylor Edmiston - 你能指导一下如何覆盖这个设置吗?我遇到了这个问题。 - MikeF
1
@MikeF 当然可以,您可以像这样覆盖它:URLField(max_length=1000, ...)。https://docs.djangoproject.com/en/3.1/ref/models/fields/#urlfield - Taylor D. Edmiston
1个回答

5

我无法说明为什么选择了原始的最大长度,您需要询问您发现的补丁的作者。请注意,MySQL将唯一字符限制为255个字符,因此选择200可避免此问题。

一旦选择了限制,更改它将会带来向后兼容性问题。由于Django 1.7添加了迁移,像这样进行更改将变得更加容易。如果您强烈要求更改它,那么Django开发人员邮件列表或票务跟踪系统可能比stackoverflow更好的地方。

您可能会发现票务19515上的讨论很有趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接