VIP Person Batch query

This commit is contained in:
dderbentsov
2023-08-03 01:21:17 +03:00
parent 5a71287fe4
commit ae18a3841a
3 changed files with 33 additions and 14 deletions

View File

@@ -4,14 +4,7 @@ from typing import List, Optional
from pydantic import BaseModel, Field, ConfigDict from pydantic import BaseModel, Field, ConfigDict
from pydantic.types import UUID4 from pydantic.types import UUID4
class Person(BaseModel):
id: UUID4
first_name: str
last_name: str
patronymic: Optional[str]
class Config:
orm_mode = True
class PersonBase(BaseModel): class PersonBase(BaseModel):
first_name: str first_name: str
@@ -56,6 +49,19 @@ class PersonCreate(PersonBase):
photos: Optional[List[str]] = [] photos: Optional[List[str]] = []
class Person(BaseModel):
id: UUID4
first_name: str
last_name: str
patronymic: Optional[str]
birth_date: Optional[date]
contacts: Optional[List[ContactCreate]] = []
class Config:
orm_mode = True
class PersonDetail(Person): class PersonDetail(Person):
id: UUID4 id: UUID4
first_name: str first_name: str

View File

@@ -1,9 +1,9 @@
from fastapi import Depends, Request from fastapi import Depends, Request
from fastapi.routing import APIRouter from fastapi.routing import APIRouter
from pydantic.types import UUID4 from pydantic.types import UUID4
from typing import List, Optional from typing import List, Optional, Dict
from personal_info.db import models from personal_info.db import models, schemas
from personal_info.db.schemas import Person, PersonDetail, PersonCreate from personal_info.db.schemas import Person, PersonDetail, PersonCreate
from personal_info.services import PersonService, get_persons_service from personal_info.services import PersonService, get_persons_service
@@ -29,3 +29,10 @@ async def create_person(
person: PersonCreate, persons_service: PersonService = Depends(get_persons_service) person: PersonCreate, persons_service: PersonService = Depends(get_persons_service)
) -> models.Person: ) -> models.Person:
return persons_service.create(person) return persons_service.create(person)
@router.post('/batch', response_model=List[schemas.Person])
async def batch_list_persons(
request: Dict = {},
persons_service: PersonService = Depends(get_persons_service)
) -> List[models.Person]:
return persons_service.batch_get(request)

View File

@@ -1,10 +1,10 @@
from typing import Any, List from typing import Any, List, Dict
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from personal_info.db.models import Person, Address, Document, Contact from personal_info.db.models import Person, Address, Document, Contact
from personal_info.db.schemas import PersonCreate, PersonBase from personal_info.db.schemas import PersonCreate, PersonBase
from personal_info.db import models
from personal_info.services.base import BaseService from personal_info.services.base import BaseService
class PersonService(BaseService[Person, PersonCreate, Any]): class PersonService(BaseService[Person, PersonCreate, Any]):
@@ -19,8 +19,6 @@ class PersonService(BaseService[Person, PersonCreate, Any]):
return objs return objs
def create(self, obj: PersonCreate) -> Person: def create(self, obj: PersonCreate) -> Person:
print('= raw' * 3 )
print(obj)
person_obj = PersonBase(**obj.dict()) person_obj = PersonBase(**obj.dict())
person = super(PersonService, self).create(person_obj) person = super(PersonService, self).create(person_obj)
@@ -44,3 +42,11 @@ class PersonService(BaseService[Person, PersonCreate, Any]):
return person return person
def batch_get(self, request: Dict) -> List[models.Person]:
if request["ids"] is None:
HTTPException(status_code=404, detail='ids required')
objs: List[models.Person] = self.db_session.query(models.Person).filter(models.Person.id.in_(request["ids"])).all()
return objs