Django - Создание ключей, включающих вычисляемые поля, которые не сохраняются в базе данных
У меня есть ряд связанных таблиц, созданных на сайте django. В таблице пользователей есть вычисляемое поле, которое классифицирует людей в зависимости от их возраста. Эта классификация меняется по мере того, как человек становится старше, поэтому я не хочу сохранять это значение в базе данных (если только оно не может автоматически обновляться по мере достижения возрастных границ). Этот код возраста должен использоваться как часть ключа для связи с полями в другой таблице. Таблица классификации берет значение 1 и значение 2 из таблицы Score и код возраста из расчета в таблице User, которая сама получает код из таблицы Age. Они обеспечивают уникальный код, который таблица классификации использует для предоставления значения обратно в таблицу Score.[Схематическое изображение таблиц здесь][1]
Я смог получить значения для таблицы очков, сами ссылки на другие таблицы, просто получение вычисленного значения обратно из таблицы User оказывается проблемой. Я не очень хочу сохранять код возраста обратно в таблицу User, если только он не может быть автоматически обновлен при пересечении возрастной границы.
Любая помощь будет очень признательна
Вот модели, которые я создал на данный момент
class User(AbstractUser): GENDER_CHOICES = ( ('F', 'Female',), ('M', 'Male',), ) gender = models.CharField(max_length=6, choices=GENDER_CHOICES) DoB = models.DateField(verbose_name="Date of Birth", null=True, help_text="Дата рождения должна иметь форму dd/mm/yyyy")
def calculate_age(self):
return int((datetime.now().date() - self.DoB).days / 365.25)
age = property(calculate_age)
def calculate_shootingas(self):
if self.gender == 'F':
if self.age >= 18:
return 1
elif self.age <= 18 and self.age >= 17:
return 2
elif self.age <= 16 and self.age >= 15:
return 3
elif self.age <= 14 and self.age >= 13 :
return 4
elif self.age <= 12:
return 5
if self.gender == 'M':
if self.age >= 18:
return 6
elif self.age <= 18 and self.age >= 17:
return 7
elif self.age <= 16 and self.age >= 15:
return 8
elif self.age <= 14 and self.age >= 13:
return 9
elif self.age <= 12:
return 10
shooting = property(calculate_shootingas)
pass
class Score(models.Model): archer = models.ForeignKey('User', related_name='scores', on_delete=models.CASCADE) rndname = models.ForeignKey('Round', related_name='round', verbose_name=("Round Name"), on_delete=models.CASCADE) shootingas = models.ForeignKey('Age', related_name='shootingas', verbose_name='Shooting as', on_delete=models.CASCADE) bowtype = models.ForeignKey('BowType', related_name='bowtypes', on_delete=models.CASCADE) score = models.IntegerField(default='') dateshot = models.DateField(verbose_name="Date Round Shot", default=timezone.now) created_date = models.DateTimeField(default=timezone.now) classindex = models.CharField(max_length =10, default='') classification = models.CharField(max_length=20, default='Unclassified', blank=True)
def index(self):
return str(self.shootingas_id) + str(self.rndname_id) + str(self.bowtype.id)
index = property(index)