diff --git a/tortoise/fields/relational.py b/tortoise/fields/relational.py index 442707848..9d4d49a55 100644 --- a/tortoise/fields/relational.py +++ b/tortoise/fields/relational.py @@ -16,6 +16,8 @@ MODEL = TypeVar("MODEL", bound="Model") +_UNSET: object = object() # sentinel for detecting omitted on_delete + class _NoneAwaitable: __slots__ = () @@ -317,13 +319,21 @@ def __init__( self, model_name: type[Model] | str, related_name: str | None | Literal[False] = None, - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] **kwargs: Any, ) -> None: super().__init__(None, **kwargs) # type:ignore[arg-type] self.validate_model_name(model_name) self.model_name = model_name self.related_name = related_name + if on_delete is _UNSET: + warnings.warn( + "Not passing `on_delete` to ForeignKeyField is deprecated and will be an error " + "in a future release. Pass `on_delete` explicitly (e.g. on_delete=fields.CASCADE).", + DeprecationWarning, + stacklevel=3, + ) + on_delete = CASCADE if on_delete not in set(OnDelete): raise ConfigurationError( "on_delete can only be CASCADE, RESTRICT, SET_NULL, SET_DEFAULT or NO_ACTION" @@ -360,7 +370,7 @@ def __init__( self, model_name: type[MODEL] | str, related_name: str | None | Literal[False] = None, - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] **kwargs: Any, ) -> None: super().__init__(model_name, related_name, on_delete, unique=True, **kwargs) @@ -386,7 +396,7 @@ def __init__( forward_key: str | None = None, backward_key: str = "", related_name: str = "", - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] field_type: type[MODEL] = None, # type: ignore unique: bool = True, **kwargs: Any, @@ -400,6 +410,14 @@ def __init__( stacklevel=2, ) unique = kwargs.pop("create_unique_index") + if on_delete is _UNSET: + warnings.warn( + "Not passing `on_delete` to ManyToManyField is deprecated and will be an error " + "in a future release. Pass `on_delete` explicitly (e.g. on_delete=fields.CASCADE).", + DeprecationWarning, + stacklevel=3, + ) + on_delete = CASCADE super().__init__(field_type, unique=unique, **kwargs) self.validate_model_name(model_name) self.model_name = model_name @@ -459,7 +477,7 @@ def OneToOneField( def OneToOneField( to: type[MODEL] | str, related_name: str | None | Literal[False] = None, - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] db_constraint: bool = True, null: bool = False, **kwargs: Any, @@ -534,7 +552,7 @@ def ForeignKeyField( def ForeignKeyField( to: type[MODEL] | str, related_name: str | None | Literal[False] = None, - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] db_constraint: bool = True, null: bool = False, **kwargs: Any, @@ -589,7 +607,7 @@ def ManyToManyField( forward_key: str | None = None, backward_key: str = "", related_name: str = "", - on_delete: OnDelete = CASCADE, + on_delete: OnDelete = _UNSET, # type: ignore[assignment] db_constraint: bool = True, unique: bool = True, **kwargs: Any,