fix overwritten pk for non id pks

This commit is contained in:
collerek
2020-09-17 19:05:46 +02:00
parent 58f8ed8fa9
commit f3e227748f
3 changed files with 51 additions and 1 deletions

BIN
.coverage

Binary file not shown.

View File

@ -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

View File

@ -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]