From 4431a643d5ecc02165a7527135e7bef571017a24 Mon Sep 17 00:00:00 2001 From: Mojix Coder Date: Sun, 6 Feb 2022 19:14:17 +0330 Subject: [PATCH] Update get_or_create method and its tests --- ormar/queryset/queryset.py | 6 ++---- ormar/relations/querysetproxy.py | 6 ++---- tests/test_queries/test_queryset_level_methods.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ormar/queryset/queryset.py b/ormar/queryset/queryset.py index 95fc97c..8bb4ce9 100644 --- a/ormar/queryset/queryset.py +++ b/ormar/queryset/queryset.py @@ -998,10 +998,8 @@ class QuerySet(Generic[T]): try: return await self.get(*args, **kwargs), False except NoMatch: - if _defaults is None: - return await self.create(**kwargs), True - else: - return await self.create(**kwargs, **_defaults), True + _defaults = _defaults or {} + return await self.create(**{**kwargs, **_defaults}), True async def update_or_create(self, **kwargs: Any) -> "T": """ diff --git a/ormar/relations/querysetproxy.py b/ormar/relations/querysetproxy.py index 255839e..4b4b9ea 100644 --- a/ormar/relations/querysetproxy.py +++ b/ormar/relations/querysetproxy.py @@ -507,10 +507,8 @@ class QuerysetProxy(Generic[T]): try: return await self.get(*args, **kwargs), False except NoMatch: - if _defaults is None: - return await self.create(**kwargs), True - else: - return await self.create(**kwargs, **_defaults), True + _defaults = _defaults or {} + return await self.create(**{**kwargs, **_defaults}), True async def update_or_create(self, **kwargs: Any) -> "T": """ diff --git a/tests/test_queries/test_queryset_level_methods.py b/tests/test_queries/test_queryset_level_methods.py index 497b40d..32e2f38 100644 --- a/tests/test_queries/test_queryset_level_methods.py +++ b/tests/test_queries/test_queryset_level_methods.py @@ -210,6 +210,20 @@ async def test_get_or_create_with_defaults(): assert book2.genre == "Historic" assert await Book.objects.count() == 1 + book, created = await Book.objects.get_or_create( + title="doesn't exist", + _defaults={"title": "overwritten", "author": "Mojix", "genre": "Historic"}, + ) + assert created is True + assert book.title == "overwritten" + + book2, created = await Book.objects.get_or_create( + title="overwritten", _defaults={"title": "doesn't work"} + ) + assert created is False + assert book2.title == "overwritten" + assert book2 == book + @pytest.mark.asyncio async def test_update_or_create():