我喜欢 Django 并且经常使用它。我发现它的大部分默认设置都是正常的,但有一个一直困扰着我,以至于我在每个项目中都覆盖了它。
a 的默认最大长度URLField https://github.com/django/django/blob/stable/1.9.x/django/db/models/fields/__init__.py#L2299模型字段有 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 规范没有指定最大长度 https://stackoverflow.com/questions/266322/is-there-a-limit-to-the-length-of-a-get-request/266345#266345,几乎所有浏览器都支持至少 2000 个字符 https://stackoverflow.com/a/417184/149428,对我来说这表明了一个新的理智的默认值。
好奇地想深入挖掘,我发现了 2007 年 1 月添加限制的第一个提交 (#f6390e8
作者:@jacobian);从那以后它基本上没有变化。
https://github.com/django/django/blob/f6390e8983dd364053078cc80361cb369b667690/django/db/models/fields/init.py#L805 https://github.com/django/django/blob/f6390e8983dd364053078cc80361cb369b667690/django/db/models/fields/__init__.py#L805
更进一步,我发现了我认为的 ORM 字段类型到数据库列类型映射代码的版本(#f69cf70
作者:@adrianholovaty)。例如,MySQL 文件于 2006 年 5 月存在,自 Django 0.95 以来具有相同的 200 个字符限制:
https://github.com/django/django/blob/f69cf70ed813a8cd7e1f963a14ae39103e8d5265/django/db/backends/mysql/creation.py#L28 https://github.com/django/django/blob/f69cf70ed813a8cd7e1f963a14ae39103e8d5265/django/db/backends/mysql/creation.py#L28