Opened 96 minutes ago

Last modified 95 minutes ago

#36886 assigned Uncategorized

URLField max_length cannot take advantage of supports_unlimited_charfield in DB backend

Reported by: Joel D Sleppy Owned by: Joel D Sleppy
Component: Database layer (models, ORM) Version: 6.0
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: yes
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When using a DB backend that supports_unlimited_charfield (postgres, sqlite), a CharField can omit max_length and allow arbitrarily long values in the database. However URLField, which inherits from CharField, forces the developer to pick a maximum length. For example, this model class:

class Thing(models.Model):
    chars = models.CharField()
    url = models.URLField()

Creates this table in postgres:

                                 Table "public.app_thing"
 Column |          Type          | Collation | Nullable |             Default              
--------+------------------------+-----------+----------+----------------------------------
 id     | bigint                 |           | not null | generated by default as identity
 chars  | character varying      |           | not null | 
 url    | character varying(200) |           | not null | 

And trying to set url = models.URLField(max_length=None) does not get recognized as a change by makemigrations.

URLs can get quite long and it's an inconvenience to pick a maximum length (and to defensively code against the possibility of it being violated). I'd like to work on this improvement myself if there's any appetite for it.

Possible changes:

  • For backwards compatibility, continue to default max_length to 200 but allow specifying None to have an unbounded field.
  • Break backwards compatibility, changing behavior to match that of CharField.

Change History (1)

comment:1 by Joel D Sleppy, 95 minutes ago

Needs documentation: set
Needs tests: set
Note: See TracTickets for help on using tickets.
Back to Top