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_lengthto200but allow specifyingNoneto have an unbounded field. - Break backwards compatibility, changing behavior to match that of
CharField.