Django количество размеров в продукте - PullRequest
1 голос
/ 02 мая 2020

Я создаю бэкэнд магазина. У меня есть модель продукта, и у каждого продукта есть модель "многие ко многим". Но есть проблема: как управлять подсчетом каждого размера для продукта? Я просто хочу контролировать, сколько каждого размера каждого продукта у меня есть. Мои модели:

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 Ответ

1 голос
/ 02 мая 2020

Вы можете сохранить это в промежуточной модели между Product и Size, указав through=… параметр [Django -doc] . Например:

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

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

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

По сути, ManyToManyField - это просто промежуточная модель с двумя ForeignKey с участвующими моделями. Он также добавляет некоторые дополнительные функции для эффективного запроса с помощью ORM, но это все.

Здесь вы можете, например, запросить размеры для Product, у которых есть хотя бы один count:

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

Для получения дополнительной информации см. Документацию по параметру through=&hellip; .

. В своем администраторе вы можете добавить эту модель как InlineModelAdmin , как указано в этот ответ :

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

class <b>ProductSizeInline</b>(admin.TabularInline):
    model = ProductSize
    extra = 2

class ProductAdmin(admin.ModelAdmin):
    inlines = (<b>ProductSizeInline</b>,)

admin.site.register(Product, ProductAdmin)
...