perf: 性能与资源优化 - 提取内联资源、数据库查询优化、限流与缓存增强
主要优化: - templates/index.html: 220KB → 28KB,内联CSS/JS提取为静态文件 - menu/serializers.py: 修复 Order.ingredients_summary N+1 查询问题 - menu/services/dish_service.py: 移除多余查询,添加 only() 限制字段 - menu/views.py: 上传接口添加每分钟20次限流 - static/js/api.js: 统一API错误处理 - zhangmenu/settings.py: 添加Whitenoise压缩、Redis缓存支持、环境变量配置 - static/css/app.css, static/js/app.js: 提取的内联资源文件 - 新增 migrations, requirements.txt, .env.example Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
f1994c869d
commit
94647e2b4b
+13
-3
@@ -46,10 +46,20 @@ class OrderSerializer(serializers.ModelSerializer):
|
||||
}
|
||||
|
||||
def get_ingredients_summary(self, obj):
|
||||
return obj.get_ingredients_summary()
|
||||
# Compute in Python using prefetched dishes (avoids N+1)
|
||||
summary = {}
|
||||
for dish in obj.dishes.all():
|
||||
for ing in dish.ingredients:
|
||||
name = ing.get('name', '').strip()
|
||||
amount = ing.get('amount', '').strip()
|
||||
if name:
|
||||
if name in summary:
|
||||
if amount:
|
||||
summary[name] += f" + {amount}"
|
||||
else:
|
||||
summary[name] = amount
|
||||
return [{'name': k, 'amount': v} for k, v in summary.items()]
|
||||
|
||||
def validate_dishes(self, value):
|
||||
return value
|
||||
|
||||
def create(self, validated_data):
|
||||
dish_ids = validated_data.pop('dish_ids', [])
|
||||
|
||||
Reference in New Issue
Block a user