Поле модели django включает атрибут других объектов

Я создаю веб-сайт, чтобы узнать структуру django. Это веб-сайт для студии веб-разработки, где вы можете настроить проект, который вам нужен для их проектирования.

Моя модельная архитектура:

Особенности: самый маленький строительный блок. Bundle: группа функций, которые вы хотите включить в свой веб-сайт. проект: общий набор функций, который может включать (или не) один пакет.

from django.db import models class Feature(models.Model): name = models.CharField(max_length=100), price = models.DecimalField(max_digits=6, decimal_places=2), description = models.TextField(), progress = models.IntegerField(), duration = models.IntegerField() def __str__(self): return self.name class Bundle(models.Model): name = models.CharField(), features = models.ManyToManyField(Feature), def __str__(self): return self.name 

Это то, что у меня есть до сих пор, это не совсем, но вы можете понять, что я хочу делать. Проблема в:

Я хочу включить поле в пакет и проект, который вычисляет общую стоимость. Значение поля будет суммой функций, включенных в атрибут features моего класса пакета.

Как я могу это сделать? Могу ли я создать поле, которое представляет собой список объектов?

Заранее спасибо.

Если вы ищете поле для суммирования, вы можете просто использовать DecimalField например:

 price_sum = DecimalField(max_digits=6, decimal_places=2) 

И используя это отношение ManyToMany , вы можете просто вычислить сумму и сохранить ее в этом поле.

Поле «это список объектов» – это поле M2M. Я не думаю, что вам нужно создавать новые поля, вы можете получить общую цену с точки зрения вычислений по вашей текущей архитектуре:

 # Here you have 'list' of features in boundle boundle_object.features.all() # And here you have the sum of prices from django.db.models import Sum boundle_object.features.aggregate(summation=Sum('price')) 

Вы можете изменить модель Bundle следующим образом:

 class Bundle(models.Model): name = models.CharField(), features = models.ManyToManyField(Feature) @property def total_feature_price(self): sum = sum(self.features.all().values_list('price', flat=True)) return sum def __str__(self): return self.name 

Тогда, если у вас есть объект Bundle , вы можете сделать следующее:

 cost = bundle.total_feature_price