Как я могу добавить два разных целочисленных поля одной модели в Django - PullRequest
1 голос
/ 15 апреля 2020
class Score(models.Model):
  Score_A=models.IntegerField()
  Score_B=models.IntegerField()

Как я могу поместить сумму этих двух полей в другое поле?

Ответы [ 4 ]

0 голосов
/ 15 апреля 2020

Вы можете переопределить метод сохранения, чтобы при создании или обновлении записи значение суммы сохранялось, как показано ниже

class Score(models.Model):
  Score_A=models.IntegerField()
  Score_B=models.IntegerField()
  sum=models.IntegerField()
 def save(self, *args, **kwargs):
        self.sum = self.Score_A +self.Score_B
        super(Score, self).save(*args, **kwargs)

0 голосов
/ 15 апреля 2020

Я бы действительно посоветовал не хранить сумму двух полей, а просто аннотировать набор запросов. Таким образом вы избежите дублирования данных , что сделает базу данных немного больше, но, что более важно, будет довольно сложно поддерживать синхронизацию полей c.

from django.db.models import F

Score.objects.annotate(Score_total=F('Score_A')+F('Score_B'))

Score объекты, которые возникают из этого набора запросов, будут иметь дополнительный атрибут Score_total, который является суммой двух полей.

Примечание : обычно имена полей в Django модели записываются в snake_case , а не PerlCase , поэтому должно быть: score_a вместо Score_A.

0 голосов
/ 15 апреля 2020

Проблема с решениями, представленными людьми, заключается в том, что они работают с базой данных, это добавляет некоторые накладные расходы, вы хотите сделать что-то вроде этого

class Score(models.Model):
    Score_A = models.IntegerField()
    Score_B = models.IntegerField()

    def overall_score(self):
        return self.Score_A + self.Score_B

Это не изменит базу данных, это может иметь некоторые побочные эффекты, такие как RACE CODITIONS , обязательно используйте select_for_update или любой другой способ блокировки DB при использовании модели Score.

Я бы хотел упомянуть, что вы должны придерживаться pep8, score_a, score_b

0 голосов
/ 15 апреля 2020

Лучшие решения для этого - создать триггер в базе данных, в котором все два поля хранятся в другом поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...