Возможно ли в таблицах модели Django выполнять арифметические операции над записью в другой таблице?
Как заполнить строку или добавить вторую таблицу? Мне нужно выполнить вычисления с последней строкой из первой таблицы и отправить результаты во вторую таблицу. Это чем-то напоминает обработку данных в двух DataFrame .
Как добавить таблицу значений в модель после выполнения вычислений на данных последней строки из другой табличной модели?
Или это возможно только при участии функциональности DataFrame?
class Model_1(models.Model):
name_1 = models.IntegerField()
name_2 = models.IntegerField()
name_3 = models.IntegerField()
name_4 = models.IntegerField()
class Model_2(models.Model):
name_5 = models.IntegerField()
name_6 = models.IntegerField()
queryset = Model_1.objects.all()
values_m1 = queryst.name_1 * queryst.name_2 / queryst.name_3 - queryst.name_4
queryset = Model_2.objects.all()
values_m2 = queryst.name_5 = values_m1
Одним из способов было бы выполнить вычисления с помощью набора queryset, а затем создать новый экземпляр Model_2 с вычисленными значениями и сохранить его.
queryset = Model_1.objects.all()
last_row = queryset.last()
values_m1 = last_row.name_1 * last_row.name_2 / last_row.name_3 - last_row.name_4
new_entry = Model_2(name_5=values_m1)
new_entry.save()
Второй вариант - использовать Django ORM для выполнения вычислений и вставки данных в одном запросе.
from django.db.models import F
Model_2.objects.create(name_5=F('name_1')*F('name_2')/F('name_3')-F('name_4'))
У вас есть два варианта синхронизации двух таблиц вместе.
- Использование сигналов Django
post_save
. В этом подходе вы устанавливаетеpost_save
для первой таблицы, а затем, вы будете обновлять вторую таблицу каждый раз, когда что-то сохраняется в первой таблице.
from django.db.models.signals import post_save
from django.dispatch import receiver
class Model_1(models.Model):
name_1 = models.IntegerField()
name_2 = models.IntegerField()
name_3 = models.IntegerField()
name_4 = models.IntegerField()
class Model_2(models.Model):
name_5 = models.IntegerField()
name_6 = models.IntegerField()
# method for updating
@receiver(post_save, sender=Model_1)
def update_stock(sender, instance, **kwargs):
# Do the calculation Here to update the model 2
- Использование триггеров Postgres. Этот подход будет реализован на вашей базе данных, и никакой код на python не будет выполняться. Все будет управляться в базе данных.