【问题标题】:Django count of sizes in product产品中的 Django 尺寸计数
【发布时间】:2020-05-02 10:21:02
【问题描述】:

我正在创建商店后端。我有产品模型,每个产品都有很多领域到尺寸模型。但是有一个问题:如何管理产品每个尺寸的计数?我只想控制我拥有的每种产品的每种尺寸的数量。我的模型:

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/')

【问题讨论】:

  • 我不太清楚你的目标是什么。更新 ProductSize 的 m2m 计数看起来很“奇怪”,通常有一个 Cart 例如包含项目的计数。
  • 现在我无法管理产品中每种尺寸的数量,用户可以在购物车中添加每种尺寸的 10000000 个

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


【解决方案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 只是一个中间模型,其中涉及的模型有两个 ForeignKeys。它还添加了一些额外的功能来有效地使用 ORM 进行查询,仅此而已。

例如,您可以在此处查询至少有一个 countProduct 的大小:

myproduct.sizes.filter(<b>productsize__count__gt=0</b>)

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

在您的管理员中,您可以将此模型添加为InlineModelAdmin,如this answer 中指定的那样:

from django.contrib import admin
from app.models import Product, ProductSize

class ProductSizeInline(admin.TabularInline):
    model = ProductSize
    extra = 2

class ProductAdmin(admin.ModelAdmin):
    inlines = (ProductSizeInline,)

admin.site.register(Product, ProductAdmin)

【讨论】:

  • 谢谢,这真的很有帮助,但我现在如何在管理面板中显示此字段?我在管理员中注册 ProductSize,但它是分开的,并且在 Product 中不再添加尺寸选择
  • @Dimabytes:你可以使用InlineModelAdminstackoverflow.com/a/5948071/67579
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2018-04-22
相关资源
最近更新 更多