models.py
class Design(models.Model):
object = models.ForeignKey(Object)
company = models.ForeignKey(Company)
number = models.CharField(max_length=32, verbose_name=u'Шифр проекта')
class Specification(models.Model):
design = models.ForeignKey(Design)
name = models.CharField(verbose_name=u'Название спецификации', max_length=32)
construction_type = models.ForeignKey(ConstructionType, verbose_name=u'Тип конструкций')
drawings = models.ManyToManyField(Drawing, verbose_name=u'Листы проекта')
amount = models.FloatField(verbose_name=u'Количество', default=1)
unit_measure = models.ForeignKey(UnitMeasure, verbose_name=u'Ед. изм.')
class SpecificationMaterial(models.Model):
specification = models.ForeignKey(Specification)
material = models.ForeignKey(Material)
amount = models.FloatField(verbose_name=u'Количество')
class Construction(models.Model):
object = models.ForeignKey(Object, verbose_name=u'Объект')
type = models.ForeignKey(ConstructionType, verbose_name=u'Тип конструкции')
name = models.CharField(max_length=128, verbose_name=u'Название конструкции')
class ConstructionSpecification(models.Model):
construction = models.ForeignKey(Construction)
specification = models.ForeignKey(Specification)
amount = models.FloatField(verbose_name=u'Количество', default=1)
class Material(models.Model):
group = models.ForeignKey(MaterialGroup)
code = models.CharField(max_length=48, verbose_name=u'Артикул', blank=True)
name = models.CharField(max_length=128, verbose_name=u'Название материала')
unit_measure = models.ForeignKey(UnitMeasure)
price = models.FloatField(verbose_name=u'Цена', blank=True)
логика такая:
Есть том проектной документации (Design), в нем есть спецификации (Specification), они состоят из материалов (SpecificationMaterial), и есть конструкции (Construction). Конструкции делаются из материалов которые есть в спецификации, причем конструкция может состоять из нескольких спецификаций.
Одна спецификация составляется на какой либо объем, поэтому в ней есть поле amount (количество), и в модели SpecificationConstruction тоже есть такое же поле в нем указывается какая часть (или сколько частей) спецификации используется в конкретной конструкции.
Расчет одного материала:
material_amount = SpecificationConstruction.amount / Specification.amount * SpecificationMaterial.amount
Надо посчитать сколько всего материалов и их стоимость по объекту Design.