feat(valuation): 添加datetime序列化支持并优化统计查询
为valuation模型添加json_encoders以支持datetime序列化 使用annotate替代原始SQL进行统计查询计数 在API响应中使用model_dump_json确保datetime正确序列化
This commit is contained in:
parent
cf95553adc
commit
3aa806ea6b
@ -28,7 +28,10 @@ async def create_valuation(
|
||||
user_id=user_id,
|
||||
data=data
|
||||
)
|
||||
return Success(data=result, msg="估值评估申请提交成功")
|
||||
# 使用model_dump_json()来正确序列化datetime,然后解析为dict
|
||||
import json
|
||||
result_dict = json.loads(result.model_dump_json())
|
||||
return Success(data=result_dict, msg="估值评估申请提交成功")
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
@ -49,8 +52,11 @@ async def get_my_valuations(
|
||||
user_id=user_id,
|
||||
query=query
|
||||
)
|
||||
# 使用model_dump_json()来正确序列化datetime,然后解析为dict列表
|
||||
import json
|
||||
serialized_items = [json.loads(item.model_dump_json()) for item in result.items]
|
||||
return SuccessExtra(
|
||||
data=result.items,
|
||||
data=serialized_items,
|
||||
total=result.total,
|
||||
page=result.page,
|
||||
size=result.size,
|
||||
@ -84,7 +90,10 @@ async def get_valuation_detail(
|
||||
detail="估值评估记录不存在"
|
||||
)
|
||||
|
||||
return Success(data=result, msg="获取估值评估详情成功")
|
||||
# 使用model_dump_json()来正确序列化datetime,然后解析为dict
|
||||
import json
|
||||
result_dict = json.loads(result.model_dump_json())
|
||||
return Success(data=result_dict, msg="获取估值评估详情成功")
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
|
||||
@ -27,6 +27,13 @@ async def create_valuation(data: ValuationAssessmentCreate):
|
||||
raise HTTPException(status_code=400, detail=f"创建失败: {str(e)}")
|
||||
|
||||
|
||||
@valuations_router.get("/statistics/overview", summary="获取统计信息")
|
||||
async def get_statistics():
|
||||
"""获取估值评估统计信息"""
|
||||
result = await valuation_controller.get_statistics()
|
||||
return Success(data=result, msg="获取统计信息成功")
|
||||
|
||||
|
||||
@valuations_router.get("/{valuation_id}", summary="获取估值评估详情")
|
||||
async def get_valuation(valuation_id: int):
|
||||
"""根据ID获取估值评估详情"""
|
||||
@ -105,13 +112,6 @@ async def search_valuations(
|
||||
)
|
||||
|
||||
|
||||
@valuations_router.get("/statistics/overview", summary="获取统计信息")
|
||||
async def get_statistics():
|
||||
"""获取估值评估统计信息"""
|
||||
result = await valuation_controller.get_statistics()
|
||||
return Success(data=result, msg="获取统计信息成功")
|
||||
|
||||
|
||||
# 批量操作接口
|
||||
@valuations_router.post("/batch/delete", summary="批量删除估值评估")
|
||||
async def batch_delete_valuations(valuation_ids: list[int]):
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
from typing import List, Optional
|
||||
from tortoise.expressions import Q
|
||||
from tortoise.queryset import QuerySet
|
||||
from tortoise.functions import Count
|
||||
|
||||
from app.models.valuation import ValuationAssessment
|
||||
from app.schemas.valuation import (
|
||||
@ -107,13 +108,13 @@ class ValuationController:
|
||||
total_count = await self.model.filter(is_active=True).count()
|
||||
|
||||
# 按行业统计
|
||||
industry_stats = await self.model.filter(is_active=True).group_by('industry').values('industry', count='COUNT(*)')
|
||||
industry_stats = await self.model.filter(is_active=True).group_by('industry').annotate(count=Count('id')).values('industry', 'count')
|
||||
|
||||
# 按非遗等级统计
|
||||
heritage_level_stats = await self.model.filter(
|
||||
is_active=True,
|
||||
heritage_level__isnull=False
|
||||
).group_by('heritage_level').values('heritage_level', count='COUNT(*)')
|
||||
).group_by('heritage_level').annotate(count=Count('id')).values('heritage_level', 'count')
|
||||
|
||||
return {
|
||||
'total_count': total_count,
|
||||
|
||||
@ -121,6 +121,9 @@ class UserValuationOut(BaseModel):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
|
||||
|
||||
class UserValuationDetail(ValuationAssessmentBase):
|
||||
@ -133,6 +136,9 @@ class UserValuationDetail(ValuationAssessmentBase):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
|
||||
|
||||
class UserValuationList(BaseModel):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user