如何反向查询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按颜色过滤产品,我该怎么办?

您可以向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属性。双下划线访问外键属性。

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

在您的视图中,您可以进行如下查询

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

最新更新