У меня есть проект, который построен с использованием Django REST Framework. У меня есть модели Item
и Tag
, между которыми существует отношение многие ко многим. При запросе списка Item
экземпляров я использую ModelMultipleChoiceFilter
для фильтрации Item
списка по тегам.
Вот мой filters.py
:
import django_filters
from .models import Item, Tag
class ItemTagFilter(django_filters.FilterSet):
tags = django_filters.ModelMultipleChoiceFilter(name='tags__text',
to_field_name='text',
queryset=Tag.objects.all(),
conjoined=False,)
class Meta:
model = Item
fields = ['tags']
Как вы можете заметить, поскольку значение conjoined
по умолчанию равно False
, я ожидаю, что любой экземпляр Item
, имеющий любой из текстов Tag
, которые я запрашиваю, будет включен в итоговый список. И, похоже, он работает для существующих Tag
экземпляров, записанных в базе данных.
Проблема в том, что, когда я ввожу несуществующий текст Tag
, возвращается пустой список, даже если я отправил вместе с ним несколько Tag
текстов, которые существуют в базе данных. (то есть я ожидаю, что фильтр вернет объединение элементов Item
, в которых есть какие-либо теги, которые я отправил в своем запросе)
Я изучил документацию Django REST Framework и несколько соответствующих сообщений SO, таких как this , но не смог найти ни основную причину проблемы, ни ее решение. Буду признателен за любую помощь.
Вы можете найти мои models.py
и views.py
ниже, если вам нужна дополнительная информация.
models.py:
from django.db import models
class Tag(models.Model):
text = models.CharField(max_length = 100, unique = True)
...
class Item(models.Model):
info = models.CharField(max_length = 200)
tags = models.ManyToManyField(Tag, related_name='items')
views.py
from rest_framework import generics
from .models import Item
from .filters import ItemTagFilter
import django_filters.rest_framework as filters
...
class ListCreateItemView(generics.ListCreateAPIView):
queryset = Item.objects.all()
filter_backends = (filters.DjangoFilterBackend,)
filter_class = ItemTagFilter
serializer_class = ItemSerializer