我正在尝试为产品颜色创建过滤器。
产品由csv导入,每种颜色都有很大的变化,例如迷彩,淡紫色,赤褐色。
我想创建一个带有一系列标准颜色的过滤器,例如红色,蓝绿色。
当选择其中一种标准颜色时,我想查询数据库并返回包含该颜色(或该颜色类别)的所有产品。
例如,如果选择了蓝色,则过滤器将返回包含颜色的任何产品的查询集:蓝色,蓝绿色,绿松石色,青色,牛仔布。
我曾尝试使用django过滤器(选项),但无法提出解决方案。
有谁知道最好的方法吗?
当前产品型号
class Product(models.Model):
aw_deep_link = models.CharField(max_length=500, default='')
product_name = models.CharField(max_length=500, default='')
aw_image_url = models.CharField(max_length=500, default='')
search_price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
merchant_name = models.CharField(max_length=500, default='')
display_price = models.CharField(max_length=500, default='')
brand_name = models.ForeignKey('Brand', on_delete=models.CASCADE)
size = models.ForeignKey('Size', on_delete=models.CASCADE)
colour = models.CharField(max_length=500, choices=COLOURS, default='')
rrp_price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
category = TreeForeignKey('Category',null=True,blank=True, on_delete=models.CASCADE)
description = models.CharField(max_length=500, default='')
def __str__(self):
return self.product_name
当前过滤器
import django_filters
from .models import Product, Brand, Category
from django.forms import CheckboxSelectMultiple
class ProductFilter(django_filters.FilterSet):
search_price__gt = django_filters.NumberFilter(name='search_price', lookup_expr='gt')
search_price__lt = django_filters.NumberFilter(name='search_price', lookup_expr='lt')
brand_name = django_filters.filters.ModelMultipleChoiceFilter( label='Brand',widget=CheckboxSelectMultiple, queryset = Brand.objects.all())
colour = django_filters.filters.MultipleChoiceFilter(choices=COLOURS, widget=CheckboxSelectMultiple)
class Meta:
model = Product
fields = ['colour', 'brand_name']
答案 0 :(得分:0)
你有各自的色调,然后你就有了各种颜色。
您需要的是一种映射颜色类别的方法,例如" blue"一个阴影列表,如["蓝色","蓝绿色","绿松石","青色","牛仔布&#34 ]
执行此操作的一种方法是使用字典
shades = {
"blue": ["blue", "teal", "turquoise", "cyan", "denim"],
"red": ...
}
然后,您允许用户从基色列表中进行选择,但在搜索之前将其映射到阴影列表。假设'颜色'包含用户选择(蓝色,红色等)
Item.objects.filter(colour__in=shades[colour])
这样的好处就是像紫罗兰色这样的个人阴影。可以在' blue',' red'的列表中和' purple'。
如果要将阴影动态映射到颜色而不是硬编码字典,则可以将颜色和阴影存储在数据库中,甚至存储在json文件中。