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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user