重构数据

This commit is contained in:
2025-03-07 00:06:56 +08:00
parent 317f29b486
commit c95dafe14d
32 changed files with 219 additions and 215 deletions

47
submission/models.py Normal file
View File

@@ -0,0 +1,47 @@
from django.db import models
from django.db.models import Sum
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_extensions.db.models import TimeStampedModel
from account.models import Profile, User
from task.models import Task
class Submission(TimeStampedModel):
user = models.ForeignKey(User, on_delete=models.CASCADE)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
score = models.IntegerField(default=0)
html = models.TextField(null=True, blank=True)
css = models.TextField(null=True, blank=True)
js = models.TextField(null=True, blank=True)
def __str__(self):
return f"{self.user.username} - {self.task.title}"
def get_task_type(self):
"""
返回任务的具体类型Challenge 或 Tutorial
"""
return self.task.task_type
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.user.profile.update_total_score()
# 信号处理函数
@receiver(post_save, sender=Submission)
def update_user_score(sender, instance, **kwargs):
"""
当 Submission 保存后,自动更新用户的总分
"""
total_score = (
Submission.objects.filter(user=instance.user).aggregate(
total_score=Sum("score")
)["total_score"]
or 0
)
profile, created = Profile.objects.get_or_create(user=instance.user)
profile.total_score = total_score
profile.save()