Django Добавление материала
Я создаю сайт, который поможет мне рассчитать стоимость моих ремесленных проектов.
class Supply(models.Model):
name = CharField(max_length = 200, null = True, blank = True)
type = ForeignKey(SupplyType, null = True, blank = True, on_delete = models.CASCADE)
vendor = ForeignKey(Vendor, null = True, blank = True, on_delete = models.CASCADE)
width = FloatField(null = True, blank = True)
length = FloatField(null = True, blank = True)
thickness = FloatField(null = True, blank = True)
amount = FloatField(null = True, blank = True)
cost = FloatField(null = True, blank = True)
@property
def square_inches(self):
try:
return round(self.width * self.length, 2)
except:
return "N/A"
@property
def cubic_inches(self):
try:
return round(self.width * self.length * self.thickness, 2)
except:
return "N/A"
@property
def cost_per_square_inch(self):
try:
return round(self.cost / self.square_inches, 2)
except:
return "N/A"
@property
def cost_per_cubic_inch(self):
try:
return round(self.cost / self.cubic_inches, 2)
except:
return "N/A"
@property
def cost_per_each(self):
try:
return round(self.cost / self.amount, 2)
except:
return "N/A"
class Meta:
verbose_name_plural = "Supplies"
def __str__(self):
return f"{self.vendor}-{self.name}"
class ProductType(models.Model):
name = CharField(max_length = 200, null = True, blank = True)
def __str__(self):
return self.name
class Product(models.Model):
name = CharField(max_length = 200, null = True, blank = True)
product_type = ForeignKey(ProductType, null = True, blank = True, on_delete = models.CASCADE)
def __str__(self):
return self.name
Я хотел бы иметь возможность добавлять разное количество материалов к товарам. Например, добавление дерева и клея для изготовления фоторамки. Дерево добавляется в качестве элемента поставки. Затем, чтобы добавить продукт, я не знаю, как добавить дерево в определенном количестве к продукту. В разных продуктах будет разное количество расходных материалов, поэтому я не хочу
class Product(models.Model):
name = Charfield(max_length = 200)
supply_1 = ForeignKey(Supply, on_delete = models.CASCADE)
supply_2 = ForeignKey(Supply, on_delete = models.CASCADE)
Я бы ввел что-то вроде "Поставка -> Древесина, количество -> 10 кубических дюймов", а затем вывел бы общую стоимость древесины. И затем продолжать добавлять для всех материалов, добавленных к продукту
Вы можете использовать отношения "многие ко многим" для вашего случая через ManyToManyField.
class Product(models.Model):
name = Charfield(max_length = 200)
supplies = models.ManyToManyField(Supply)
supply_wood = Supply.objects.create(name='Wood', ...)
supply_glue = Supply.objects.create(name='Glue', ...)
product_frame = Product(name='Picture Frame')
product_frame.supplies.add(supply_wood, supply_glue)
product_frame.save()
Теперь ваш продукт Picture Frame
сопоставлен с этими двумя поставками. Если у вас есть дополнительные поставки, вы можете просто добавить их.
supply_glass = Supply.objects.create(name='Glass', ...)
product_frame.supplies.add(supply_glass)
product_frame.save()
Для доступа ко всем материалам, связанным с продуктом Picture Frame
product_frame.supplies.all()
Поскольку это отношение "многие ко многим":
- Один продукт может быть сопоставлен с несколькими поставками, например,
Picture Frame
может быть сопоставлен сWood
,Glue
иGlass
. - И наоборот, одно предложение может быть использовано в нескольких продуктах, например,
Wood
может быть сопоставлено сPicture Frame
,Table
,Cabinet
и т.д.- Для доступа к обратной связи, например, для доступа ко всем продуктам, которые использует предложение
Wood
:supply_wood.product_set.all()
- Для доступа к обратной связи, например, для доступа ко всем продуктам, которые использует предложение