Django:过滤产品颜色

时间:2018-04-07 14:19:58

标签: django

我正在尝试为产品颜色创建过滤器。

产品由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']

1 个答案:

答案 0 :(得分:0)

你有各自的色调,然后你就有了各种颜色。

您需要的是一种映射颜色类别的方法,例如" blue"一个阴影列表,如["蓝色","蓝绿色","绿松石","青色","牛仔布&#34 ]

执行此操作的一种方法是使用字典

shades = {
 "blue": ["blue", "teal", "turquoise", "cyan", "denim"],
 "red": ...   
}

然后,您允许用户从基色列表中进行选择,但在搜索之前将其映射到阴影列表。假设'颜色'包含用户选择(蓝色,红色等)

Item.objects.filter(colour__in=shades[colour])

这样的好处就是像紫罗兰色这样的个人阴影。可以在' blue',' red'的列表中和' purple'。

如果要将阴影动态映射到颜色而不是硬编码字典,则可以将颜色和阴影存储在数据库中,甚至存储在json文件中。