ModelMultipleChoiceFilter - Поле «id» ожидало число, но получило «Закусочная»

Итак, у меня есть простая рекламная модель и FilterView, показывающая все объявления. Объявления можно фильтровать по разным тегам, хранящимся в отдельной модели, объединенной с помощью ManyToManyField.

Я использую django-filter для настройки небольшого ModelMultipleChoiceFilter и позволяю пользователям выбирать разные теги для фильтрации рекламы. Это работает, однако использует tag__id. Я хотел бы использовать поле tag__slug.

Поэтому я добавил атрибут "to_field_name='slug'", но получаю следующее;

Поле «id» ожидало число, но получило «закусочная».

Следующий код работает, но фильтрует только по tag__id, например:

/?теги=6

и я хотел бы видеть что-то вроде этого;

?tags=закусочная

модели.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

фильтры.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'
        ]

Как я могу добиться фильтрации на основе имени модели или слага вместо идентификатора?

С наилучшими пожеланиями,


person Kevin D.    schedule 06.02.2020    source источник


Ответы (1)