Производное (расчетное) поле из другой модели

Я начал простой проект django начального уровня для практики, он использует sql-server в качестве базы данных (mssql-django).

Как я могу иметь производный атрибут (вычисляемый столбец) из другой таблицы в качестве поля в моей модели?

Допустим, у меня есть такая модель

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)
    birth_date = models.DateField()

class JobTitles(models.Model):
    job_title = CharField(max_length=20)

class Jobs(models.Model):
    job_id = models.OneToOneField(
        JobTitles,
        on_delete=models.CASCADE,
    )
    person_id = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
    )
    job_income_in_usd = models.IntegerField()

class Salary(models.Model):
    person_id = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
    )
    name = 'SELECT name FROM Person WHERE Salary.person_id = Person.id'
    income_in_euro = 'SELECT job_income_in_usd * 0.89 FROM Jobs INNER JOIN Salary ON Salary.person_id=Jobs.person_id'
    age = 'SELECT datediff(year, (SELECT birth_date FROM Person WHERE Salary.person_id=Person.id), getdate())'

Как мне реализовать приведенные выше коды SELECT в кодах Python-Django?

Связанные вопросы:

Производный атрибут в модели Django

Как добавить вычисляемое поле в модель Django

Django получение имен полей из разных моделей

Соответствующий вопрос по SQL-Server:

Как создать производный атрибут?

Для этого можно использовать декоратор @property, вот пример:

class Salary(models.Model):
    person_id = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
    )
    
    @property
    def name(self):
        return self.person_id.name if self.person_id else None

    @property
    def income_in_euro(self):
        if not self.person_id:
           return
        return Jobs.objects.filter(person_id_id=sellf.person_id_id).first(). job_income_in_usd * 0.89

btw я не думаю, что это хорошая идея называть ваши ForeignKeys с _id в конце.

Вернуться на верх