如何反向查询 django_filters 字段

how to reverse query for django_filters fields

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 按颜色过滤产品,我应该怎么做??

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

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

您可以在 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