所以我有一个简单的广告模型和一个显示所有广告的过滤器视图。广告可以通过存储在由ManyToManyField连接的单独模型中的不同标签进行过滤。
我正在使用django-filter来设置一个小的ModelMultipleChoiceFilter,并让用户选择不同的标签来过滤广告。这是有效的,但它使用tag__id。我希望它使用tag__slug字段。
因此,我添加了属性"to_field_name='slug'",但我得到以下内容;
字段"id"期望一个数字,但得到了"晚餐"。
以下代码确实有效,但只能按tag__id进行筛选,如下所示:
/?标签=6
我宁愿看到这样的东西;
?标签=晚餐
models.py
class Ad(models.Model):
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
description = RichTextField()
tags = models.ManyToManyField('Tag')
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, null=True)
class Meta:
ordering = ['-title']
def __str__(self):
return self.title
class Tag(models.Model):
name = models.CharField(max_length=200, help_text='Titel van de tag')
slug = models.SlugField(max_length=200, null=True)
def __str__(self):
return self.name
filters.py
from django import forms
from discovery.grid.models import Ad, Tag
import django_filters
class AdFilter(django_filters.FilterSet):
tags = django_filters.ModelMultipleChoiceFilter(
# to_field_name='slug',
queryset=Tag.objects.all(),
widget=forms.CheckboxSelectMultiple)
class Meta:
model = Ad
fields = [
'tags'
]
如何实现基于模型名称或 slug 而不是 id 的过滤?
致以最诚挚的问候,
也许你可以这样尝试:
class AdFilter(django_filters.FilterSet):
tags = CharFilter(method='my_custom_filter')
def my_custom_filter(self, queryset, name, value):
return queryset.filter(**{
'tags__slug__iexact': value,
})
class Meta:
model = Ad
fields = [
'tags'
]
更多信息可以在documentation
中找到。