【发布时间】:2015-10-14 22:27:03
【问题描述】:
我正在尝试通过它的名称字段过滤 manytomany 字段,但我无法正确设置它。任何人都可以看看这个吗?
模型
class Criteria(models.Model):
name = models.CharField(max_length=400, primary_key=True)
tests = models.ManyToManyField(Test)
class Test(models.Model):
name = models.CharField(max_length=4000)
观看次数
class CriteriaViewSet(DefaultsMixin, viewsets.ModelViewSet):
queryset = Criteria.objects.all()
filter_class = CriteriaFilter
filter_fields = ('tests',)
def get_serializer_class(self):
if self.action == 'list':
return CriteriaSerializer
return CriteriaDetailSerializer
过滤器集
class CriteriaFilter(django_filters.FilterSet):
test = django_filters.CharFilter(name="tests__name", lookup_type='contains')
class Meta:
model = Criteria
fields = ('tests',)
序列化器
class CriteriaSerializer(serializers.ModelSerializer):
tests = serializers.StringRelatedField(many=True)
links = serializers.SerializerMethodField()
class Meta:
model = Criteria
fields = ('name', 'tests', 'links')
def get_links(self, obj):
request = self.context['request']
return {
'self': reverse('api:criterium-detail',
kwargs={'pk': obj.pk},
request=request),
}
通过上面的配置,我在 URL 上得到:
/api/criteria/?test=FB1400
即使有许多包含已寻址测试的标准,结果数组也是空的:
HTTP 200 OK Content-Type: application/json Vary: Accept Allow: GET, POST, HEAD, OPTIONS
{
"count": 0,
"next": null,
"previous": null,
"results": []
}
我在fields 中尝试了不同的查找(精确、包含、包含)以及不同的值,但这些都不适合我...
我也想知道是否应该在某处设置 django 过滤器后端,但我不确定如何执行此操作,也不知道在这种情况下是否有必要。
【问题讨论】:
-
在 DRF 2.4.4 中,您必须在视图集中指定
filter_backends,例如filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)
标签: django django-rest-framework django-filter