diff --git a/.coverage b/.coverage index 454571f..6cf1da0 100644 Binary files a/.coverage and b/.coverage differ diff --git a/ormar/queryset/queryset.py b/ormar/queryset/queryset.py index 46edf65..7a44fec 100644 --- a/ormar/queryset/queryset.py +++ b/ormar/queryset/queryset.py @@ -207,6 +207,9 @@ class QuerySet: # Execute the insert, and return a new model instance. instance = self.model_cls(**kwargs) pk = await self.database.execute(expr) - if pk: + pk_name = self.model_cls.Meta.pkname + if pk_name not in kwargs and pk_name in new_kwargs: + instance.pk = new_kwargs[self.model_cls.Meta.pkname] + if pk and isinstance(pk, self.model_cls.pk_type()): setattr(instance, self.model_cls.Meta.pkname, pk) return instance diff --git a/tests/test_non_integer_pkey.py b/tests/test_non_integer_pkey.py new file mode 100644 index 0000000..7e1022f --- /dev/null +++ b/tests/test_non_integer_pkey.py @@ -0,0 +1,47 @@ +import random + +import databases +import pytest +import sqlalchemy + +import ormar +from tests.settings import DATABASE_URL + +database = databases.Database(DATABASE_URL, force_rollback=True) +metadata = sqlalchemy.MetaData() + + +def key(): + return "".join(random.choice("abcdefgh123456") for _ in range(8)) + + +class Model(ormar.Model): + class Meta: + tablename = "models" + metadata = metadata + database = database + + id: ormar.String(primary_key=True, default=key, max_length=8) + name: ormar.String(max_length=32) + + +@pytest.fixture(autouse=True, scope="function") +def create_test_database(): + engine = sqlalchemy.create_engine(DATABASE_URL) + metadata.create_all(engine) + yield + metadata.drop_all(engine) + + +@pytest.mark.asyncio +async def test_pk_1(): + async with database: + model = await Model.objects.create(name="NAME") + assert isinstance(model.id, str) + + +@pytest.mark.asyncio +async def test_pk_2(): + # async with database: + model = await Model.objects.create(name="NAME") + assert await Model.objects.all() == [model] \ No newline at end of file