Добрый день, недавно начал изучать Django. Не могу найти решение данной задачи, по этому обращаюсь к Вам.
Есть цилиндры из различных материалов, параметры которых описаны в нескольких таблицах.
Добавление параметров:
models.py
from django.db import models
# Добавление параметров:
class Cylinder(models.Model):
name = models.CharField('Марка цилиндра', max_length=50)
diameter = models.FloatField('Диаметр цилиндра')
def __str__(self):
return str(self.name)
class CylinderMaterial(models.Model):
material = models.CharField('Материал цилиндра', max_length=30)
density = models.FloatField('Плотность материала')
waste = models.FloatField('Процент отходов')
description = models.TextField('Описание цилиндра', max_length=250)
price = models.FloatField('Стоимость материала')
def __str__(self):
return str(self.material)
# Модель для добавления цилиндра в БД.
class AddCylinder(models.Model):
name = models.ForeignKey('Cylinder', verbose_name = 'Марка цилиндра', on_delete=models.CASCADE, related_name='+')
material = models.ForeignKey('Cylinder', verbose_name = 'Материал цилиндра', on_delete=models.CASCADE, related_name='+')
height = models.FloatField('Высота цилиндра, м')
Форма для ввода данных
from .models import *
from django import forms
class AddCylinder(models.Model):
name = models.ForeignKey('Cylinder', verbose_name = 'Марка цилиндра', on_delete=models.CASCADE, related_name='+')
material = models.ForeignKey('Cylinder', verbose_name = 'Материал цилиндра', on_delete=models.CASCADE, related_name='+')
height = models.FloatField('Высота цилиндра, м')
mass = models.FloatField('Масса цилиндра') # Приходится добавлять пустые поля чтобы Django вводил туда значения после рассчетов
cost = models.FloatField('Стоимость цилиндра') # Приходится добавлять пустые поля чтобы Django вводил туда значения после рассчетов
Нужно чтобы когда пользователь в форме выбирал 'Марку цилиндра', 'Материал цилиндра' и вводил "высоту" Django рассчитывал и добавлял в БД массу и стоимость цилиндра.
На данный момент расчет происходит в файле views.py с огромными костылями.
views.py
from django.shortcuts import render, redirect
from desing.models import *
def add_сylinder(request):
if request.method == 'POST':
form = AddCylinderForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
material = form.cleaned_data['material']
height = form.cleaned_data['height']
diameter = Cylinder.objects.values_list('diameter', flat=True).get(name=name) # Получение диаметра в зависимости от выбраной марки цилиндра
diameter_num = int(str(diameter)) # Получение числогого значения для рассчетов
density = CylinderMaterial.objects.values_list('density', flat=True).get(material=material) # Получение плотности в зависимости от выбранного материала
density_num = int(str(density)) # Получение числогого значения для рассчетов
price = CylinderMaterial.objects.values_list('price', flat=True).get(material=material) # Получение стимости в зависимости от выбранного материала
price_num = int(str(price))
mass = diameter_num * diameter_num * 0,7854 * density_num / 1000 # Рассчет массы цилиндра
cost = mass * height * price_num # Рассчет стоимости цилиндра
obj.name = name
obj.height = height
obj.mass = mass
obj.cost = cost
obj.save()
return redirect('add_сylinder')
else:
form = AddCylinderForm()
return render(request, 'desing/add_сylinder.html', {'form': form})
Есть ли красивый способ как производить подобного рода расчеты в Django сохраняя связь с моделями в которых хранятся параметры материала, например чтобы в случае изменения цены сохраненные в БД цилиндры автоматически обновляли стоимость.
Очень буду благодарен всем кто откликнется и поможет с решением данного вопроса.
Updated 26 Feb. 2021, 10:56 by Kaiser.