Создайте класс модели Django, одно из значений поля которого вычисляется по значениям полей другой модели, и оно должно присутствовать в моей фактической таблице базы данных

#python #django

#python #django

Вопрос:

models.py

 from django.db import models

class model_A(models.Model):
  value_1 = models.IntegerField()
  value_2 = models.FloatField()

class model_B(modles.Model):
  value_3 = models.FloatField()
  value_4 = (model_A.value_1 - model_B.value_2)
 

admin.py

 from django.contrib import admin

# Register your models here.
from .models import model_A, model_B

model_lst = [model_A, model_B]

for i in model_lst:
    admin.site.register(i)
 

Я хочу, чтобы model_B имел value_4 в качестве отдельного столбца в таблице базы данных (model_B)

Комментарии:

1. Пожалуйста, исправьте свой фрагмент, в настоящее время ваш код не имеет смысла. Вы не можете вычитать поля в моделях.

2. @jerch пожалуйста, проверьте … хотите, чтобы значение value_4 col таблицы базы данных model_B было diff значений из таблицы model_A vakue_1 и vakue_2

3. Это все равно так не работает — для этого вам нужны экземпляры. Чтобы получить экземпляры, вам нужно как-то выразить отношение model_A к model_B (например, с помощью поля fk или o2o).). С этим полем на месте вы можете выражать value_4 во время запроса как аннотированное поле, например qs_on_B.annotate(value4=F('fk_to_A__value_1') - F('value_3'))

Ответ №1:

Для этой цели вы можете использовать computedfield:

https://pypi.org/project/django-computedfields/

Комментарии:

1. Пожалуйста, обратите внимание, что django-computedfields как шаблон денормализации полезен только для определенных узких мест запросов в сильно нормализованной схеме БД и должен использоваться только в том случае, если вам известны проблемы с рассинхронизацией, связанные с дублированием данных. Его никогда не следует использовать для обхода правильной нормализации и выполнения тестов с аннотированными полями в первую очередь.