Как получить уникальную запись для каждой категории в django - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть таблица с названием product_type & Product.

class Product_type(models.Model):
    product_type_id = models.AutoField(primary_key=True)
    product_type_name = models.CharField(max_length=255, null = False, unique=True)
    product_type_title = models.CharField(max_length=255, null = True)
    product_type_description = models.TextField(null = False)
    product_type_slug = models.SlugField(unique=True, blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='category')
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    product_name = models.CharField(max_length=255, null = False, unique=True)
    product_slug = models.SlugField(unique=True, blank=True, null=True)
    product_title = models.CharField(max_length=255, null = True)
    product_info = models.TextField(null = False)
    product_description = models.CharField(max_length = 255)
    product_price = models.CharField(max_length = 255)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True)
    product_type = models.ForeignKey(Product_type, on_delete=models.SET_NULL, null=True)
    product_status = models.CharField(max_length = 100, default = "publish")
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

class Brand(models.Model):
    brand_id = models.AutoField(primary_key=True)
    brand_name = models.CharField(max_length=255, null = False, unique=True)
    brand_slug = models.SlugField(unique=True, blank=True, null=True)
    brand_title = models.CharField(max_length = 255)
    brand_logo = models.ImageField(upload_to = 'brand/logo/%Y/%m/')
    brand_logo_alt_text = models.CharField(max_length=255, null = False)
    brand_info = models.TextField(null = False)
    brand_description = models.CharField(max_length = 255)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    country = models.ForeignKey(Country, default = '1', on_delete=models.SET_DEFAULT, null=True)
    brand_status = models.CharField(max_length = 100, default = "publish")
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

в таблице продуктов. Я связал таблицу брендов как бренд и таблицу product_type как product_type, поэтому предположим, что у меня есть несколько записей для каждого бренда в продукте. Таблица. Поэтому мне нужна только 1 запись для каждого бренда с наименьшим значением product_price, и эта запись должна соответствовать product_type.

, например: я хочу только тот продукт, который содержит product_type = 'accounting'. так вот демонстрационные данные: product (данные модели)

product_id: 1, product_name: ab c, product_type: Accounting, бренд: aaa, цена: $ 100

product_id: 2, product_name: xyz, product_type: бухгалтерский учет, бренд: aaa, цена: $ 50

product_id: 3, product_name: bdf, product_type: бухгалтерский учет, бренд: bbb, цена: $ 150

product_id: 4, product_name: ghf, product_type: other, бренд: ccc, цена: $ 150


, поэтому мой результат запроса будет product_id 2,3, потому что 1,2 имеют тот же бренд, но 2 имеет самую низкую цену & 2,3 у обоих есть product_type = accounting.

Я слишком много пытался, но ничего не работает.

Я хочу твоей помощи!

1 Ответ

0 голосов
/ 14 февраля 2020

Сначала используйте models.DecimalField для цены товара. Не используйте models.CharField для чисел. Измените поле product_price на product_price = models.DecimalField(max_digits=6, decimal_places=2) (хранит $ 0 до $ 9999,99).

Затем вы можете попробовать следующее:

from django.db.models import F, Min

Product.objects.filter(
    product_type=my_product_type
).annotate(
    min_brand_price=Min('brand__product_type__product_price')
).filter(
    product_price=F('min_brand_price')
)

Другие связанные вопросы по StackOverflow:

...