ModelMultipleChoiceFilter - поле 'id' ожидало число, но получило 'Diner' - PullRequest
0 голосов
/ 06 февраля 2020

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

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

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

Ожидается поле 'id' номер, но получил 'diner'.

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

/? tags = 6

и я бы предпочел что-то подобное;

? Tags = diner

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'
        ]

Как мне достичь фильтрация по названию модели или слагу вместо id?

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

1 Ответ

0 голосов
/ 06 февраля 2020

Может быть, вы можете попробовать так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...