Fix submission list API performance: N+1 queries, missing indexes, and in-memory pagination

- Add select_related("user") in update_score() to eliminate N+1 on rating.user.role
- Return QuerySet directly from list_submissions so @paginate works at DB level
- Defer html/css/js fields in list queries to reduce data transfer
- Add db_index on flag field for filtered queries
- Add select_related("task", "user") to get_submission endpoint
- Replace manual list() serialization with resolve_* methods on SubmissionOut

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-09 18:26:32 +08:00
parent d4727b1538
commit 417e7c34bc
4 changed files with 66 additions and 31 deletions

View File

@@ -44,6 +44,7 @@ class Submission(TimeStampedModel):
null=True,
blank=True,
default=None,
db_index=True,
verbose_name="标记",
)
@@ -63,7 +64,7 @@ class Submission(TimeStampedModel):
"""
更新当前Submission的分数
"""
ratings = self.ratings.all()
ratings = list(self.ratings.select_related("user").all())
super_score = 0.0
admin_score = 0.0
@@ -77,13 +78,13 @@ class Submission(TimeStampedModel):
else:
normal_score += rating.score
if ratings.exists():
if ratings:
total_score = super_score * 0.5 + admin_score * 0.3 + normal_score * 0.2
self.score = total_score / ratings.count()
self.score = total_score / len(ratings)
else:
self.score = 0.0
self.save()
self.save(update_fields=["score"])
def save(self, *args, **kwargs):
super().save(*args, **kwargs)