Как использовать поле ManyToMany в django со сквозной моделью, отображая его и сохраняя?
Я делаю базовую систему на Django для спа, которая требует, чтобы у меня был инвентарь, массажи, которые используют различные количества продукта в инвентаре, а затем услуга, которая будет комбинацией нескольких массажей. Таким образом, пользователь спа, то есть персонал, сможет создать услугу, выбрать, какие массажи делают эту услугу, и это мгновенно вызовет вычитание этого продукта из инвентаря. Я использовал отношение "многие ко многим" для связи массажей и товаров, а также сквозную модель для сохранения количества использованных товаров. Мой вопрос в том, как лучше всего отобразить это в форме, чтобы сотрудники могли добавлять новые массажи, выбирая множество товаров и их соответствующее количество, которое будет использовано для массажа? И как я могу сохранить все это в БД? Я использую PostgreSQL. Вот как мои модели выглядят сейчас:
class Producto(models.Model):
nombre = models.CharField(max_length=200, blank=False)
línea = models.CharField(max_length=200, blank=False)
proveedor = models.CharField(max_length=200, blank=False)
costo_mxn = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
unidad_de_medición_choices = [
("g", "g"),
("mL", "mL"),
("oz", "oz"),
]
unidad_de_medición = models.CharField(max_length=20, choices=unidad_de_medición_choices,null=True, blank=True)
cantidad_actual = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
cantidad_inicial = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
cantidad_alerta = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
fecha_de_registro = models.DateField(blank=True,null=True,default= datetime.today)
def __str__(self):
return self.nombre
class Masaje(models.Model):
nombre = models.CharField(max_length=200, blank=False)
productos = models.ManyToManyField(Producto, through='CantidadProducto',blank=True)
costo = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
duracion = models.DurationField()
descripcion = models.TextField(
max_length=500, blank=True, null=True
)
class CantidadProducto(models.Model):
masaje = models.ForeignKey(Masaje,on_delete=models.CASCADE)
producto = models.ForeignKey(Producto,on_delete=models.CASCADE)
cantidad_usada = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
Теперь я использую простые формы для отображения других частей системы, которые я сделал не такими сложными, например, массажиста, вот так:
class MasajistaForm(ModelForm):
class Meta:
model = Masajista
fields = (
'nombre',
'telefono_celular',
'fecha_de_nacimiento',
)
widgets = {
'nombre': forms.TextInput(attrs={'class':''}),
'telefono_celular': forms.TextInput(attrs={'class':''}),
'fecha_de_nacimiento': forms.SelectDateWidget(years=range(1900, 2023),months = MONTHS,attrs={'class':''},empty_label=("Año", "Mes", "Dia"))
}
С результатом типа это
Теперь, я знаю, что это выглядит не очень хорошо, но сейчас проблема не в этом, я бы хотел, чтобы сотрудники могли видеть такую форму, где можно было бы нажать кнопку "плюс" или что-то вроде этого, где появилось бы новое поле выбора с выбором уже зарегистрированных товаров, и поле ввода, которое можно было бы заполнить вручную, а затем сохранить. Каким должен быть путь?