1.不要重复自己
在模型中包含一个包含同一模型中其他一些字段的总数的字段似乎是个坏主意。更新一个而不是另一个太容易了,导致字段不一致。
所以我的建议是删除该total
字段并在需要时计算它。
您可以向EmployeeRating
模型中添加一个在 Python 中计算它的方法:
class EmployeeRating(models.Model):
# ...
@property
def total_rating(self):
return self.rating_1 + self.rating_2 + self.rating_3 + self.rating_4
如果您需要查询总数,您可以使用extra()
:
EmployeeRating.objects.extra(
where = ['rating_1 + rating_2 + rating_3 + rating_4 > 10'])
2.标准化!
这很尴尬的原因是您的模型没有完全标准化。如果您有多个评分附加到一条EmployeeRating
记录,实现它们的自然方法是有一个单独的表。如果这样做,您的模型将如下所示:
class EmployeeRating(models.Model):
# ... other fields, e.g. foreign key to Employee model.
class Rating(models.Model):
employee_rating = models.ForeignKey(EmployeeRating, related_name='ratings')
rating = models.IntegerField()
# ... other fields, e.g. who performed the evaluation, or when it was done.
然后您可以annotate()
在需要获取总数时使用:
from django.db.models import Sum
EmployeeRating.objects.annotate(total_rating = Sum('ratings__rating'))