#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:
Комментарии:
1. Пожалуйста, обратите внимание, что django-computedfields как шаблон денормализации полезен только для определенных узких мест запросов в сильно нормализованной схеме БД и должен использоваться только в том случае, если вам известны проблемы с рассинхронизацией, связанные с дублированием данных. Его никогда не следует использовать для обхода правильной нормализации и выполнения тестов с аннотированными полями в первую очередь.