Fix #600: revamp Tortoise/Pydantic interaction (#612)

This commit is contained in:
François Voron
2021-04-20 14:46:36 +02:00
committed by GitHub
parent 61a99755e8
commit 3ac67377cb
6 changed files with 76 additions and 44 deletions

View File

@ -1,7 +1,8 @@
from typing import Optional, Type
from typing import Optional, Type, cast
from pydantic import UUID4
from tortoise import fields, models
from tortoise.contrib.pydantic import PydanticModel
from tortoise.exceptions import DoesNotExist
from tortoise.queryset import QuerySetSingle
@ -17,14 +18,6 @@ class TortoiseBaseUserModel(models.Model):
is_superuser = fields.BooleanField(default=False, null=False)
is_verified = fields.BooleanField(default=False, null=False)
async def to_dict(self):
d = {}
for field in self._meta.db_fields:
d[field] = getattr(self, field)
for field in self._meta.backward_fk_fields:
d[field] = await getattr(self, field).all().values()
return d
class Meta:
abstract = True
@ -72,9 +65,11 @@ class TortoiseUserDatabase(BaseUserDatabase[UD]):
query = query.prefetch_related("oauth_accounts")
user = await query
user_dict = await user.to_dict()
pydantic_user = await cast(
PydanticModel, self.user_db_model
).from_tortoise_orm(user)
return self.user_db_model(**user_dict)
return cast(UD, pydantic_user)
except DoesNotExist:
return None
@ -89,8 +84,11 @@ class TortoiseUserDatabase(BaseUserDatabase[UD]):
if user is None:
return None
user_dict = await user.to_dict()
return self.user_db_model(**user_dict)
pydantic_user = await cast(PydanticModel, self.user_db_model).from_tortoise_orm(
user
)
return cast(UD, pydantic_user)
async def get_by_oauth_account(self, oauth: str, account_id: str) -> Optional[UD]:
try:
@ -99,9 +97,11 @@ class TortoiseUserDatabase(BaseUserDatabase[UD]):
).prefetch_related("oauth_accounts")
user = await query
user_dict = await user.to_dict()
pydantic_user = await cast(
PydanticModel, self.user_db_model
).from_tortoise_orm(user)
return self.user_db_model(**user_dict)
return cast(UD, pydantic_user)
except DoesNotExist:
return None