如何反转django_filters字段的查询

时间:2017-08-26 12:07:33

标签: django django-filters

models.py

class Product(models.Model):
    .
    .
    pass


class Color(models.Model):
    color_name = models.CharField(blank=True, max_length=50)
    color = ColorField(default='#FF0000')


class ProductColor(models.Model):
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    color = models.ForeignKey('Color', on_delete=models.CASCADE)

filters.py

class ProductFilter(django_filters.FilterSet):
    class Meta:
           model = Product
           fields = ['color',]

我想用django_filters按颜色过滤产品怎么办?

2 个答案:

答案 0 :(得分:0)

在您的视图中,您可以像这样进行查询

c = Color('my desired color', '#ffffff')
result = ProductColor.objects.filter(color=c.color)
for r in result:
   # do something ...

答案 1 :(得分:0)

您可以在filters.py文件中添加新过滤器,但请参考ProductColor模型。

<强> filters.py

class ProductFilter(django_filters.FilterSet):
    productcolor__color__color = django_filters.CharFilter(lookup_expr='iexact')
    productcolor__color__color_name = django_filters.CharFilter(lookup_expr='iexact')

    class Meta:
        model = Product

请注意,我使用productcolor__color__color来引用color模型中的Color属性。双下划线访问ForeignKey属性。

lookup_expr='iexact'将匹配小写和大写颜色代码( #fff * #FFF )。

然后,用于过滤查询集的简单HTML可以是:

<form method="get">
    {{ filter.form.as_p }}
    <button type="submit">Search</button>
</form>
<ul>
    {% for product in filter.qs %}
        <li>{{ product.name }}</li>
    {% endfor %}
</ul>

{{ product.name }}只是一个示例,我不知道您的Product模型是否有name字段。但您可以按照{{ product.<field_name> }}

访问您的产品

您可以在此处详细了解 django_filters https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html