过滤产品 Django "LATEST"、"BEST SALE"、"TOP RATED"、"ON SALE"
Filter product 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_sale,因此您可以设置其他字段,例如 on_sale_start_date/on_sale_end_date 和一个函数来检查它们并修改 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_sale,因此您可以设置其他字段,例如 on_sale_start_date/on_sale_end_date 和一个函数来检查它们并修改 on_sale 值