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

时间:2015-12-11 00:06:51

标签: python django url django-models orm

我喜欢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个字符,尤其是查询字符串。

我理解虽然HTTP规范does not specify a maximum length,但几乎所有浏览器都支持at least 2000 characters,这对我来说是一个新的合理默认值。

很想深入挖掘,我发现第一次承诺在2007年1月添加限制(@ f6390e8由@jacobian提供);从那时起它基本没有改变。

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

回过头来看,我发现了我认为代码映射字段类型的版本到ORM的数据库列类型(#f69cf70 by @adrianholovaty)。例如,MySQL的文件存在于2006年5月,自Django 0.95以来具有相同的200个字符限制:

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

1 个答案:

答案 0 :(得分:3)

我不能说为什么选择原始的最大长度,你必须向作者询问你找到的补丁。请注意MySQL restricts unique var chars to 255 characters,因此选择200可以避免此问题。

选择限制后,更改它会产生向后兼容性问题。由于在Django 1.7中添加了迁移,因此更容易进行这样的更改。如果你强烈想要改变它,那么Django开发者邮件列表或票据跟踪器可能是一个比堆栈溢出更好的地方。

您可能会发现有关ticket 19515的讨论很有趣。