Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Added
Fixed
^^^^^
- ``MigrationRecorder`` now uses parameterized queries; fixes MariaDB/MySQL rejecting ISO-8601 ``applied_at`` values. (#2132)
- ``db_default`` on ``ForeignKeyField``/``OneToOneField`` now propagates to the underlying ``<fk>_id`` column, so ``CREATE TABLE`` emits the ``DEFAULT`` clause for FK columns. (#2199)
- ``MigrationRecorder`` no longer emits tortoise's own ``pk`` field ``DeprecationWarning`` when applying migrations; it now builds its bookkeeping model with ``primary_key=True``. (#2203)
- ``QuerySet.count()`` now matches the limited query result for the LIMIT/OFFSET edge cases: it returns ``0`` (instead of a negative number) when ``offset()`` exceeds the total row count, and ``0`` (instead of the total) for ``limit(0)``. (#2208)
- Field declarations on models now resolve to their concrete type (e.g. ``CharField[str]``) in Pyright/Pylance instead of ``Field[Unknown]``; the ``Field.__new__`` type-check stub now returns ``Self``. (#2216)
Expand Down
33 changes: 33 additions & 0 deletions tests/migrations/test_schema_editor_sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,36 @@ class Meta:
sql = client.executed[0]
assert 'CREATE TABLE "widget"' in sql
assert "DEFAULT 'active'" in sql


@pytest.mark.asyncio
async def test_create_model_includes_db_default_on_fk() -> None:
"""CreateModel should include DEFAULT clause for FK columns with db_default."""

class Dc(Model):
id = fields.IntField(primary_key=True)

class Meta:
table = "dc"
app = "models"

class App(Model):
id = fields.IntField(primary_key=True)
dc: fields.ForeignKeyRelation[Dc] = fields.ForeignKeyField("models.Dc", db_default=2)

class Meta:
table = "app"
app = "models"

init_apps(Dc, App)

client = FakeClient("sql")
editor = TestSchemaEditor(client)

await editor.create_model(App)

assert len(client.executed) == 1
sql = client.executed[0]
assert 'CREATE TABLE "app"' in sql
assert '"dc_id"' in sql
assert "DEFAULT 2" in sql
2 changes: 1 addition & 1 deletion tortoise/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def init_fk_o2o_field(model: type[Model], field: str, is_o2o: bool = False) -> N
key_field = f"{field}_id"
key_fk_object.reference = fk_object
key_fk_object.source_field = fk_object.source_field or key_field
for attr in ("index", "default", "null", "generated", "description"):
for attr in ("index", "default", "null", "generated", "description", "db_default"):
setattr(key_fk_object, attr, getattr(fk_object, attr))
if is_o2o:
key_fk_object.pk = fk_object.pk
Expand Down
Loading