django - 筛选产品 Django "LATEST"、"BEST SALE"、"TOP RATED"、"ON SALE"
问题描述
我有 4 个类别LATEST
、BEST SALE
和。TOP RATED
ON SALE
在 中
LATEST
,我想展示 20 个最近添加的产品。在 中
BEST SALE
,需要展示具有最畅销状态的产品。在 中
TOP RATED
,需要展示 20 个评分较高的产品。在 中
ON SALE
,需要显示 20 个具有销售状态的产品。
如何为这些类别制作过滤器?非常感谢。请举一些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')
解决方案
您可以使用以下方法过滤它们:
最新:
Product.objects.all().order_by('-created')[:20]
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
TOP RATED - 您应该添加一个存储平均评分的字段和一个计算平均评分并修改该字段的函数。设置后,您可以再次过滤,如 1。
ON SALE - 设置一个 on_sale 布尔字段,该字段将显示产品是否在销售。由于您可能使用大量产品和大量 on_sales,您可以设置其他字段,例如 on_sale_start_date/on_sale_end_date 以及检查它们并修改 on_sale 值的函数
推荐阅读
- reactjs - 如何在 Redux 中管理嵌套的 reducer?
- c - 根据文件中的行创建数组
- uwp - 使用连续听写
- reactjs - 如何使用命令提示符检查当前版本的 React
- sql - sql中的nameUUIDFromBytes
- lambda - 返回 lambda 函数与在 python 装饰器中返回方法的区别
- swift - 当我滚动时,TableView DidSelectRowAt 将更改其他单元格的背景颜色
- sql-server - 在字符串中捕获字符串
- php - 在 Laravel 中返回数据库查询时更改字段值
- python - 如何根据特定列在 Pandas Dataframe 中上移行