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()
      
Вернуться на верх