0
class EmployeeRating(models.Model):
    rating_1 = models.IntegerField(default = 0)
    rating_2 = models.IntegerField(default = 0)
    rating_3 = models.IntegerField(default = 0)
    rating_4 = models.IntegerField(default = 0)
    rating_4 = models.IntegerField(default = 0)
    total = models.IntegerField(default = 0)

モデル フォームを使用して値を取得し、自動的に値を「合計」に割り当てます。

4

2 に答える 2

1

1.同じことを繰り返さない

同じモデル内の他のいくつかのフィールドの合計を含むモデル内のフィールドを持つことは、悪い考えのようです。一方を更新しても他方を更新できず、フィールドの一貫性が失われてしまうのは非常に簡単です。

したがって、私の提案は、totalフィールドを削除して、必要なときに計算することです。

EmployeeRatingPython で計算するモデルにメソッドを追加できます。

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'))
于 2013-04-04T15:20:51.507 に答える