【发布时间】:2019-01-31 15:09:40
【问题描述】:
我有一个使用 Django REST 框架构建的项目。我有模型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,我希望任何具有我请求的Tag 文本的任何Item 实例都包含在结果列表中。它似乎适用于数据库中记录的现有Tag 实例。
问题是,当我输入一个不存在的 Tag 文本时,会返回一个空列表,即使我在其旁边发送了几个确实存在于数据库中的 Tag 文本。 (即我希望过滤器返回 Item 元素的联合,这些元素具有我在请求中发送的任何标签)
我查看了 Django REST Framework documentation 和几个相关的 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
【问题讨论】:
标签: python django django-rest-framework tagging