【发布时间】:2023-02-17 20:08:19
【问题描述】:
我想减少类似查询的数量。这是我的模型:
class Skill(models.Model):
name = models.TextField()
class Employee(models.Model):
firstname = models.TextField()
skills = models.ManyToManyField(Skill, through='SkillStatus')
def skills_percentage(self):
completed = 0
total = 0
for skill in self.skills.all().prefetch_related("skillstatus_set__employee"):
for item in skill.skillstatus_set.all():
if item.employee.firstname == self.firstname:
total += 1
if item.status:
completed += 1
try:
percentage = round((completed / total * 100), 2)
except ZeroDivisionError:
percentage = 0.0
return f"{percentage} %"
class SkillStatus(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
skill = models.ForeignKey(Skill, on_delete=models.CASCADE)
status = models.BooleanField(default=False)
我的主要问题与方法 skills_percentage 有关,我在计算提到的值时进行了太多查询。我已经使用 prefetch_related 稍微改善了情况,但是 Django 调试工具栏中仍然有额外的查询。这里还能做什么?
我尝试使用 select_related 和 prefetch_related 的不同组合。我考虑了其他选项来计算 skills_percentage 但它们也需要许多查询......
提前致谢。
【问题讨论】:
标签: python-3.x django many-to-many django-queryset django-prefetch-related