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'))