Django产品尺寸的计数

时间:2020-05-02 10:21:02

标签: python django python-3.x django-models

我正在创建商店后端。我有产品型号,每个产品都有许多不同尺寸的型号。但是有一个问题:如何管理产品每种尺寸的数量?我只想控制每种产品的每种尺寸有多少。我的模特:

class Size(models.Model):
    class Meta:
        verbose_name = "Размер"
        verbose_name_plural = "Размеры"
    size = models.CharField(max_length=255, verbose_name="Размер")

    def __str__(self):
        return self.size


class Image(models.Model):
    class Meta:
        verbose_name = "Фотография"
        verbose_name_plural = "Фотографии"
    image = models.ImageField(verbose_name="Фотография", upload_to='product_images/')

    def __str__(self):
        return self.image.name

class Product(models.Model):
    class Meta:
        verbose_name = "Товар"
        verbose_name_plural = "Товары"
    title = models.CharField(max_length=255, verbose_name='Название')
    images = models.ManyToManyField(Image, verbose_name="Фотографии")
    cost = models.IntegerField(verbose_name='Цена')
    sizes = models.ManyToManyField(Size, verbose_name='Размеры')
    description = models.TextField(max_length=2000, verbose_name='Описание')
    structure = models.CharField(max_length=50, verbose_name="Материал")
    sizes_image = models.ImageField(verbose_name="Сетка размеров", upload_to='product_sizes/')

1 个答案:

答案 0 :(得分:1)

您可以通过指定through=… parameter [Django-doc]将其存储在ProductSize之间的中间模型中。例如:

class Size(models.Model):
    size = models.CharField(max_length=255)

class Product(models.Model):
    sizes = models.ManyToManyField(Size, through='ProductSize')

class ProductSize(models.Model):
    size = models.ForeignKey(Size, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    count = models.IntegerField(default=1)

实质上,ManyToManyField只是一个中间模型,其中涉及的模型有两个ForeignKey。它还添加了一些额外的功能来有效地使用ORM进行查询,仅此而已。

例如,您可以在此处查询至少具有一个Product的{​​{1}}的大小:

count

有关更多信息,请see the documentation on the through=… parameter

在管理员中,您可以按照this answer中的指定,将此模型添加为myproduct.sizes.filter(productsize__count__gt=0)

InlineModelAdmin