Django: Предварительная загрузка запроса из django-simple-history

Мне нужно предварительно загрузить запросы истории обновлений, сохраненные с помощью django-simple-history, чтобы значительно улучшить время выполнения запросов, например, у меня есть такие модели в моем приложении:


class Staff(models.Model):
    registration = models.CharField(max_length=100, unique=True)
    identification_type = models.CharField(max_length=2, choices=(
        ('V', 'V'),
        ('E', 'E'),
        ('J', 'J')
    ), default='V')
    identification_number = models.CharField(max_length=100, unique=True)
    first_names = models.CharField(max_length=100)
    last_names = models.CharField(max_length=100)
    birth_date = models.DateField()
    hire_date = models.DateField()
    hire_date_to_public_administration = models.SmallIntegerField(default=0)
    termination_date = models.DateField(null=True)
    sex = models.CharField(max_length=10, choices=(
        ('F', 'Femenino'),
        ('M', 'Masculino')
    ))
    address = models.TextField()
    marital_status = models.CharField(max_length=15, choices=(
        ('Soltero/a', 'Soltero/a'),
        ('Casado/a', 'Casado/a'),
        ('Divorciado/a', 'Divorciado/a')
    ))
    education_level = models.CharField(max_length=100)
    department = models.ForeignKey(
        Department,
        on_delete=models.RESTRICT,
        related_name='staffs'
    )
    position = models.ForeignKey(
        Position,
        on_delete=models.RESTRICT,
        related_name='staffs'
    )
    payroll_type = models.CharField(max_length=10, choices=[
        ('Empleado', 'Empleado'),
        ('Obrero', 'Obrero'),
    ], default='Empleado')
    worker_type = models.CharField(max_length=10, choices=[
        ('Fijo', 'Fijo'),
        ('Contratado', 'Contratado'),
        ('Pensionado', 'Pensionado'),
        ('Jubilado', 'Jubilado'),
    ], default='Contratado')
    status = models.CharField(max_length=100, choices=(
        ('Activo', 'Activo'),
        ('Inactivo', 'Inactivo'),
    ), default='Activo')
    bank = models.CharField(max_length=100)
    bank_number = models.CharField(max_length=100)
    concepts = models.ManyToManyField(
        Concept,
        related_name='staffs',
        blank=True
    )
    salary = models.DecimalField(max_digits=8, decimal_places=2)
    children_number = models.SmallIntegerField(default=0)
    is_disabled = models.BooleanField(default=False)
    receive_complement = models.BooleanField(default=False)
    history = HistoricalRecords()


    class Meta:
        ordering = ['identification_number']


class Payment(models.Model):
    date = models.ForeignKey(
        Calendar,
        on_delete=models.RESTRICT,
        related_name="payments"
    )
    staff = models.ForeignKey(
        Staff,
        on_delete=models.RESTRICT
    )
    total = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    total_deduction = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    total_allowance = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    paid_concepts = models.ManyToManyField('PaidConcept')
    create_at = models.DateTimeField(auto_now_add=True)

Я пытаюсь сделать запрос для получения платежей за заданную дату.

payments = (
    Payment.objects.filter(date__id=week.id, staff__worker_type=worker_type)
    .select_related('staff', 'staff__department')
    .order_by('staff__last_names')
)

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

for payment in payments:
    historical_staff_data = payment.staff.history.as_of(payment.create_at)

    data.append({
        'staff_registration': historical_staff_data.registration,
        'staff_identification_number': historical_staff_data.identification_number,
        'staff_first_names': historical_staff_data.first_names,
        'staff_last_names': historical_staff_data.last_names,
        'staff_bank_number': historical_staff_data.bank_number,
        'total': payment.total
    })

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

Я попытался сделать это так, как объясняется в документации по jango-simple-history, но это не сработало.

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