Calls :meth:`pre_save_polymorphic` and saves the model.
(
self,
force_insert: bool | tuple[ModelBase, ...] = False,
force_update: bool = False,
using: str | None = None,
update_fields: Iterable[str] | None = None,
)
| 120 | self.polymorphic_ctype_id = ctype.pk |
| 121 | |
| 122 | def save( |
| 123 | self, |
| 124 | force_insert: bool | tuple[ModelBase, ...] = False, |
| 125 | force_update: bool = False, |
| 126 | using: str | None = None, |
| 127 | update_fields: Iterable[str] | None = None, |
| 128 | ) -> None: |
| 129 | """Calls :meth:`pre_save_polymorphic` and saves the model.""" |
| 130 | # Determine the database to use via Django's routing infrastructure: |
| 131 | # 1. Explicit 'using' parameter takes precedence |
| 132 | # 2. Otherwise consult DATABASE_ROUTERS via router.db_for_write() |
| 133 | # 3. The router falls back to _state.db, then DEFAULT_DB_ALIAS |
| 134 | self.pre_save_polymorphic( |
| 135 | using=( |
| 136 | using |
| 137 | or router.db_for_write(self.__class__, instance=self) |
| 138 | or self._state.db |
| 139 | or DEFAULT_DB_ALIAS |
| 140 | ) |
| 141 | ) |
| 142 | return super().save( |
| 143 | force_insert=force_insert, |
| 144 | force_update=force_update, |
| 145 | using=using, |
| 146 | update_fields=update_fields, |
| 147 | ) |
| 148 | |
| 149 | save.alters_data = True # type: ignore[attr-defined] |
| 150 |