首页 > 解决方案 > 筛选产品 Django "LATEST"、"BEST SALE"、"TOP RATED"、"ON SALE"

问题描述

我有 4 个类别LATESTBEST SALE和。TOP RATEDON SALE

如何为这些类别制作过滤器?非常感谢。请举一些Django的例子。

#functions link to path image upload
def user_products_path(instance, filename):
    return 'products/user_{0}/{1}'.format(instance.created_by, filename)

class ParentCategory(models.Model):
    name = models.CharField(_('Name'), max_length=105, blank=True, null=True, default=None)
    short_description = CKEditor5Field(_('Short description'), config_name='extends', null=True)
    image = models.ImageField(_('Image'), default='noimage.png', upload_to='admin/menu')
    is_active = models.BooleanField(_('Active'), default=True)
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False, )
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % self.name

    class Meta:
        verbose_name = _('Parent Menu')
        verbose_name_plural = _('Parent Menu')

class MenuBarProduct(models.Model):
    name = models.CharField(_('Name'), max_length=105, blank=True, null=True, default=None)
    #parent = models.ForeignKey(ParentMenu, verbose_name=_('Parent menu'), on_delete=models.CASCADE, blank=True, null=True, default=None)
    image = models.ImageField(_('Image'), default='noimage.png', upload_to='admin/menu')
    #short_description = CKEditor5Field(_('Short description'), config_name='extends', null=True)
    is_active = models.BooleanField(_('Active'), default=True)
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False, )
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % self.name

    class Meta:
        verbose_name = _('Menu bar')
        verbose_name_plural = _('Menu bar')

class CategoryProduct(models.Model):
    name = models.CharField(_('Name'), max_length=105, blank=True, null=True, default=None)
    image = models.ImageField(_('Image'), default='noimage.png', upload_to='admin/menu')
    #short_description = CKEditor5Field(_('Short description'), config_name='extends', null=True)
    is_active = models.BooleanField(_('Active'), default=True)
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False, )
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % self.name
    class Meta:
        verbose_name = _('Category Menu')
        verbose_name_plural = _('Category Menu')


class ProductCategory(models.Model):
    name = models.CharField(_('Name'), max_length=65, blank=True, null=True, default=None, help_text=_('The maximum number of characters - 65'))
    slug = models.CharField(_('ULR'), max_length=65, blank=True, null=True, default=None, help_text=_('This field fill up automatically (URL links of product'))
    short_description = CKEditor5Field(_('Short description'), config_name='extends', blank=True, null=True, default=None)
    image = models.ImageField(_('Image'), default='picture.pnp', null=True, upload_to=user_products_path)
    is_active = models.BooleanField(_('Active'), default=True, help_text=_('Activated, allow to publish'))
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False, )
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % self.name

    class Meta:
        verbose_name = _('Category')
        verbose_name_plural = _('Categories')


class Product(models.Model):
    
    StatusProduct=(
        (_(''), _('')),
        (_('best sale'), _('BEST SALE')),
        (_('on sale'), _('ON SALE')),
    )
    
    name = models.CharField(_('Name'), max_length=150, blank=True, null=True, default=None, help_text=_('The maximum number of characters - 150'))
    price = models.DecimalField(_('Price'), max_digits=10, decimal_places=1, default=0)
    discount = models.IntegerField(_('Discount'), default=0)
    status = models.CharField(_('Status'), max_length=20, choices=StatusProduct, default='')
    parentcategory = models.ForeignKey(ParentCategory, verbose_name=_('Category'), on_delete=models.CASCADE, blank=True, null=True, default=None)
    category = models.ForeignKey(MenuBarProduct, verbose_name=_('Category'), on_delete=models.CASCADE, blank=True, null=True, default=None)
    subcategory = models.ForeignKey(CategoryProduct, verbose_name=_('Category'), on_delete=models.CASCADE, blank=True, null=True, default=None)
    short_description = CKEditor5Field(_('Short description'), config_name='extends', blank=True, null=True, default=None)
    description = CKEditor5Field(_('Description'),config_name='extends', blank=True, null=True, default=None)
    is_active = models.BooleanField(_('Active'), default=True, help_text=_('Activated, allow to publish'))
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % (self.name)

    class Meta:
        verbose_name = _('Product')
        verbose_name_plural = _('Product')


class ProductImage(models.Model):
    product = models.ForeignKey(Product, verbose_name=_('Product'), on_delete=models.CASCADE, blank=True, null=True, default=None)
    image = models.ImageField(_('Image'), upload_to=user_products_path)
    is_main = models.BooleanField(_('Active main'), default=False, help_text=_('Active to publish main image'))
    is_active = models.BooleanField(_('Active'), default=False, help_text=_('Activated, allow to publish'))
    created = models.DateTimeField(_('Created'), auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(_('Updated'), auto_now_add=False, auto_now=True)
    created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.CASCADE, editable=False, null=True, blank=True)

    def __str__(self):
        return "%s" % self.id

    class Meta:
        verbose_name = _('Product Image')
        verbose_name_plural = _('Images of products')

标签: djangofiltercategoriesproduct

解决方案


您可以使用以下方法过滤它们:

  1. 最新:

    Product.objects.all().order_by('-created')[:20]

  2. BEST SALE - 您可以添加一个新的 total_sales 字段并再次订购它们:

    Product.objects.all().order_by('-total_sales')[:20]

或者您可以将其添加为属性:

def is_best_sale(self):
    if self.total_sales > 20:
        return True
    else:
        return False
  1. TOP RATED - 您应该添加一个存储平均评分的字段和一个计算平均评分并修改该字段的函数。设置后,您可以再次过滤,如 1。

  2. ON SALE - 设置一个 on_sale 布尔字段,该字段将显示产品是否在销售。由于您可能使用大量产品和大量 on_sales,您可以设置其他字段,例如 on_sale_start_date/on_sale_end_date 以及检查它们并修改 on_sale 值的函数


推荐阅读