Skip to content

Commit 9fbe1a9

Browse files
authored
[5.0] Add db_default= parameter to models Field classes (#1876)
1 parent b2de20f commit 9fbe1a9

File tree

7 files changed

+38
-12
lines changed

7 files changed

+38
-12
lines changed

django-stubs/contrib/gis/db/models/fields.pyi

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ from django.contrib.gis.geos import (
1313
Polygon,
1414
)
1515
from django.core.validators import _ValidatorCallable
16-
from django.db.models.expressions import Combinable
17-
from django.db.models.fields import Field, _ErrorMessagesMapping, _FieldChoices
16+
from django.db.models.expressions import Combinable, Expression
17+
from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping, _FieldChoices
1818
from django.utils.functional import _StrOrPromise
1919

2020
# __set__ value type
@@ -51,6 +51,7 @@ class BaseSpatialField(Field[_ST, _GT]):
5151
null: bool = ...,
5252
db_index: bool = ...,
5353
default: Any = ...,
54+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
5455
editable: bool = ...,
5556
auto_created: bool = ...,
5657
serialize: bool = ...,
@@ -95,6 +96,7 @@ class GeometryField(BaseSpatialField[_ST, _GT]):
9596
null: bool = ...,
9697
db_index: bool = ...,
9798
default: Any = ...,
99+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
98100
editable: bool = ...,
99101
auto_created: bool = ...,
100102
serialize: bool = ...,

django-stubs/contrib/postgres/fields/array.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ from typing import Any, TypeVar
33

44
from django.core.validators import _ValidatorCallable
55
from django.db.models import Field, Transform
6-
from django.db.models.expressions import Combinable
7-
from django.db.models.fields import _ErrorMessagesDict, _ErrorMessagesMapping, _FieldChoices
6+
from django.db.models.expressions import Combinable, Expression
7+
from django.db.models.fields import NOT_PROVIDED, _ErrorMessagesDict, _ErrorMessagesMapping, _FieldChoices
88
from django.db.models.fields.mixins import CheckFieldDefaultMixin
99
from django.utils.functional import _StrOrPromise
1010

@@ -37,6 +37,7 @@ class ArrayField(CheckFieldDefaultMixin, Field[_ST, _GT]):
3737
null: bool = ...,
3838
db_index: bool = ...,
3939
default: Any = ...,
40+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
4041
editable: bool = ...,
4142
auto_created: bool = ...,
4243
serialize: bool = ...,

django-stubs/db/backends/base/schema.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ from django.db.models.base import Model
1010
from django.db.models.constraints import BaseConstraint
1111
from django.db.models.fields import Field
1212
from django.db.models.indexes import Index
13+
from django.db.models.sql.compiler import _AsSqlType
1314
from typing_extensions import Self
1415

1516
logger: Logger
@@ -76,6 +77,7 @@ class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
7677
def skip_default(self, field: Any) -> bool: ...
7778
def skip_default_on_alter(self, field: Any) -> bool: ...
7879
def prepare_default(self, value: Any) -> Any: ...
80+
def db_default_sql(self, field: Field) -> _AsSqlType: ...
7981
def effective_default(self, field: Field) -> int | str: ...
8082
def quote_value(self, value: Any) -> str: ...
8183
def create_model(self, model: type[Model]) -> None: ...

django-stubs/db/models/fields/__init__.pyi

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ from django.core.checks import CheckMessage
1111
from django.core.exceptions import FieldDoesNotExist as FieldDoesNotExist
1212
from django.db.backends.base.base import BaseDatabaseWrapper
1313
from django.db.models import Model
14-
from django.db.models.expressions import Col, Combinable
14+
from django.db.models.expressions import Col, Combinable, Expression
1515
from django.db.models.fields.reverse_related import ForeignObjectRel
1616
from django.db.models.query_utils import Q, RegisterLookupMixin
1717
from django.forms import Widget
@@ -144,6 +144,7 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]):
144144
choices: _ChoicesList | None
145145
db_column: str | None
146146
db_comment: str | None
147+
db_default: type[NOT_PROVIDED] | Expression
147148
column: str
148149
concrete: bool
149150
default: Any
@@ -182,6 +183,7 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]):
182183
validators: Iterable[validators._ValidatorCallable] = ...,
183184
error_messages: _ErrorMessagesMapping | None = ...,
184185
db_comment: str | None = ...,
186+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
185187
) -> None: ...
186188
def __set__(self, instance: Any, value: _ST) -> None: ...
187189
# class access
@@ -282,6 +284,7 @@ class DecimalField(Field[_ST, _GT]):
282284
null: bool = ...,
283285
db_index: bool = ...,
284286
default: Any = ...,
287+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
285288
editable: bool = ...,
286289
auto_created: bool = ...,
287290
serialize: bool = ...,
@@ -310,6 +313,7 @@ class CharField(Field[_ST, _GT]):
310313
null: bool = ...,
311314
db_index: bool = ...,
312315
default: Any = ...,
316+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
313317
editable: bool = ...,
314318
auto_created: bool = ...,
315319
serialize: bool = ...,
@@ -339,6 +343,7 @@ class SlugField(CharField[_ST, _GT]):
339343
blank: bool = ...,
340344
null: bool = ...,
341345
default: Any = ...,
346+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
342347
editable: bool = ...,
343348
auto_created: bool = ...,
344349
serialize: bool = ...,
@@ -374,6 +379,7 @@ class URLField(CharField[_ST, _GT]):
374379
db_index: bool = ...,
375380
rel: ForeignObjectRel | None = ...,
376381
default: Any = ...,
382+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
377383
editable: bool = ...,
378384
serialize: bool = ...,
379385
unique_for_date: str | None = ...,
@@ -405,6 +411,7 @@ class TextField(Field[_ST, _GT]):
405411
null: bool = ...,
406412
db_index: bool = ...,
407413
default: Any = ...,
414+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
408415
editable: bool = ...,
409416
auto_created: bool = ...,
410417
serialize: bool = ...,
@@ -455,6 +462,7 @@ class GenericIPAddressField(Field[_ST, _GT]):
455462
null: bool = ...,
456463
db_index: bool = ...,
457464
default: Any = ...,
465+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
458466
editable: bool = ...,
459467
auto_created: bool = ...,
460468
serialize: bool = ...,
@@ -489,6 +497,7 @@ class DateField(DateTimeCheckMixin, Field[_ST, _GT]):
489497
null: bool = ...,
490498
db_index: bool = ...,
491499
default: Any = ...,
500+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
492501
editable: bool = ...,
493502
auto_created: bool = ...,
494503
serialize: bool = ...,
@@ -519,6 +528,7 @@ class TimeField(DateTimeCheckMixin, Field[_ST, _GT]):
519528
null: bool = ...,
520529
db_index: bool = ...,
521530
default: Any = ...,
531+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
522532
editable: bool = ...,
523533
auto_created: bool = ...,
524534
serialize: bool = ...,
@@ -553,6 +563,7 @@ class UUIDField(Field[_ST, _GT]):
553563
db_index: bool = ...,
554564
rel: ForeignObjectRel | None = ...,
555565
default: Any = ...,
566+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
556567
editable: bool = ...,
557568
serialize: bool = ...,
558569
unique_for_date: str | None = ...,
@@ -591,6 +602,7 @@ class FilePathField(Field[_ST, _GT]):
591602
null: bool = ...,
592603
db_index: bool = ...,
593604
default: Any = ...,
605+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
594606
editable: bool = ...,
595607
auto_created: bool = ...,
596608
serialize: bool = ...,

django-stubs/db/models/fields/files.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ from django.core.files.base import File
66
from django.core.files.images import ImageFile
77
from django.core.files.storage import Storage
88
from django.db.models.base import Model
9-
from django.db.models.fields import Field, _ErrorMessagesMapping, _FieldChoices
9+
from django.db.models.expressions import Expression
10+
from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping, _FieldChoices
1011
from django.db.models.query_utils import DeferredAttribute
1112
from django.utils._os import _PathCompatible
1213
from django.utils.functional import _StrOrPromise
@@ -58,6 +59,7 @@ class FileField(Field):
5859
null: bool = ...,
5960
db_index: bool = ...,
6061
default: Any = ...,
62+
db_default: type[NOT_PROVIDED] | Expression | str = ...,
6163
editable: bool = ...,
6264
auto_created: bool = ...,
6365
serialize: bool = ...,

django-stubs/db/models/fields/related.pyi

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@ from uuid import UUID
44

55
from django.core import validators # due to weird mypy.stubtest error
66
from django.db.models.base import Model
7-
from django.db.models.expressions import Combinable
8-
from django.db.models.fields import Field, _AllLimitChoicesTo, _ErrorMessagesMapping, _FieldChoices, _LimitChoicesTo
7+
from django.db.models.expressions import Combinable, Expression
8+
from django.db.models.fields import (
9+
NOT_PROVIDED,
10+
Field,
11+
_AllLimitChoicesTo,
12+
_ErrorMessagesMapping,
13+
_FieldChoices,
14+
_LimitChoicesTo,
15+
)
916
from django.db.models.fields.mixins import FieldCacheMixin
1017
from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor as ForwardManyToOneDescriptor
1118
from django.db.models.fields.related_descriptors import ForwardOneToOneDescriptor as ForwardOneToOneDescriptor
@@ -56,6 +63,7 @@ class RelatedField(FieldCacheMixin, Field[_ST, _GT]):
5663
db_index: bool = ...,
5764
rel: ForeignObjectRel | None = ...,
5865
default: Any = ...,
66+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
5967
editable: bool = ...,
6068
serialize: bool = ...,
6169
unique_for_date: str | None = ...,
@@ -110,6 +118,7 @@ class ForeignObject(RelatedField[_ST, _GT]):
110118
null: bool = ...,
111119
db_index: bool = ...,
112120
default: Any = ...,
121+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
113122
editable: bool = ...,
114123
auto_created: bool = ...,
115124
serialize: bool = ...,
@@ -166,6 +175,7 @@ class ForeignKey(ForeignObject[_ST, _GT]):
166175
null: bool = ...,
167176
db_index: bool = ...,
168177
default: Any = ...,
178+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
169179
editable: bool = ...,
170180
auto_created: bool = ...,
171181
serialize: bool = ...,
@@ -207,6 +217,7 @@ class OneToOneField(ForeignKey[_ST, _GT]):
207217
null: bool = ...,
208218
db_index: bool = ...,
209219
default: Any = ...,
220+
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
210221
editable: bool = ...,
211222
auto_created: bool = ...,
212223
serialize: bool = ...,

scripts/stubtest/allowlist_todo_django50.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ django.contrib.gis.db.backends.spatialite.schema.SpatialiteSchemaEditor.alter_db
1212
django.contrib.gis.db.models.Case.allowed_default
1313
django.contrib.gis.db.models.ExpressionWrapper.allowed_default
1414
django.contrib.gis.db.models.F.allowed_default
15-
django.contrib.gis.db.models.Field.__init__
1615
django.contrib.gis.db.models.Field._get_flatchoices
1716
django.contrib.gis.db.models.Field.generated
1817
django.contrib.gis.db.models.FilteredRelation.relabeled_clone
@@ -74,7 +73,6 @@ django.db.backends.base.features.BaseDatabaseFeatures.supports_nulls_distinct_un
7473
django.db.backends.base.features.BaseDatabaseFeatures.supports_stored_generated_columns
7574
django.db.backends.base.features.BaseDatabaseFeatures.supports_virtual_generated_columns
7675
django.db.backends.base.operations.BaseDatabaseOperations.prepare_join_on_clause
77-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.db_default_sql
7876
django.db.backends.mysql.features.DatabaseFeatures.allows_group_by_selected_pks
7977
django.db.backends.mysql.features.DatabaseFeatures.delete_can_self_reference_subquery
8078
django.db.backends.mysql.features.DatabaseFeatures.has_native_uuid_field
@@ -107,7 +105,6 @@ django.db.migrations.serializer.BaseUnorderedSequenceSerializer
107105
django.db.models.Case.allowed_default
108106
django.db.models.ExpressionWrapper.allowed_default
109107
django.db.models.F.allowed_default
110-
django.db.models.Field.__init__
111108
django.db.models.Field._get_flatchoices
112109
django.db.models.Field.generated
113110
django.db.models.FilteredRelation.relabeled_clone
@@ -133,7 +130,6 @@ django.db.models.expressions.OrderByList.allowed_default
133130
django.db.models.expressions.RawSQL.allowed_default
134131
django.db.models.expressions.Value.allowed_default
135132
django.db.models.expressions.When.allowed_default
136-
django.db.models.fields.Field.__init__
137133
django.db.models.fields.Field._get_flatchoices
138134
django.db.models.fields.Field.generated
139135
django.db.models.fields.related.ForeignKey.cast_db_type

0 commit comments

Comments
 (0)