【问题标题】:Django: Filter for Product ColourDjango:产品颜色过滤器
【发布时间】:2018-04-07 14:19:57
【问题描述】:

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

产品由 csv 导入,每种颜色都有很大的不同,例如迷彩、淡紫色、赤褐色。

我想创建一个带有标准颜色选择的过滤器,例如红色、蓝绿色。

When one of the standard colours is selected, I would like to query the database and return all products that contain that colour (or that are in that colour category).

例如,如果选择了蓝色,过滤器将返回包含以下颜色的任何产品的查询集:蓝色、蓝绿色、绿松石色、青色、牛仔布。

我曾尝试使用 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']

【问题讨论】:

    标签: django


    【解决方案1】:

    你有不同的颜色深浅,然后你有颜色的类别。

    您需要一种将“蓝色”等颜色类别映射到 [“蓝色”、“蓝绿色”、“绿松石”、“青色”、“牛仔布”等色调列表的方法]

    一种方法是使用字典

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

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

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

    这样做的好处是,“紫罗兰色”等单独的色调可以出现在“蓝色”、“红色”和“紫色”的列表中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2022-11-02
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多