fix overwritten pk for non id pks
This commit is contained in:
@ -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
|
||||
|
||||
47
tests/test_non_integer_pkey.py
Normal file
47
tests/test_non_integer_pkey.py
Normal 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]
|
||||
Reference in New Issue
Block a user