模型多项选择筛选器 - 字段 'id'期望一个数字,但得到了'Diner'



所以我有一个简单的广告模型和一个显示所有广告的过滤器视图。广告可以通过存储在由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中找到。

最新更新