Django rest framework charfilter json



我在django-rest charfilterinfilter中有一个筛选器(field_name='genres__name',lookup_expr='in'(。我在数据库中有两个类别是通过多对多来接近我的,但我在过滤这个产品的两个类别时有两个元素,我只需要一个元素

查看

class CharFilterInFilter(filters.BaseInFilter, filters.CharFilter):
pass
class ShoppFilter(filters.FilterSet):
price = filters.RangeFilter()
genres = CharFilterInFilter(field_name='genres__name')
title = SearchFilter()
class Meta:
model = smartphone
fields = ['price','genres','title']

class MDShopListView(generics.ListAPIView):
queryset = smartphone.objects.all()
filter_backends = (DjangoFilterBackend,SearchFilter)
search_fields = ['title']
filterset_class = ShoppFilter

def get(self, request):
queryset = self.filter_queryset(self.get_queryset())
serializer=MDShopListSerializer(queryset,many=True)
return Response(serializer.data)

型号

genres = models.ManyToManyField(Genre, verbose_name="жанры")

class Genre(models.Model):
[enter image description here][1]
name = models.CharField("Имя", max_length=100)

img json1:https://i.stack.imgur.com/4WR6L.png

此处更改并工作
queryset=self.filter_queryset(self.get_queryset(((.dispinct((

class CharFilterInFilter(filters.BaseInFilter, filters.CharFilter):
pass
class ShoppFilter(filters.FilterSet):
price = filters.RangeFilter()
genres = CharFilterInFilter(field_name='genres__name', lookup_expr='in')
title = SearchFilter()

class Meta:
model = smartphone
fields = ['price','genres','title']

class MDShopListView(generics.ListAPIView):
queryset = smartphone.objects.all()
filter_backends = (DjangoFilterBackend,SearchFilter)
search_fields = ['title']
filterset_class = ShoppFilter


def get(self, request):
queryset = self.filter_queryset(self.get_queryset()).distinct()
serializer=MDShopListSerializer(queryset,many=True)
return Response(serializer.data)

这是ManyToMany字段的常见问题,解决方案是将distinct方法应用于查询:

class ShoppFilter(filters.FilterSet):
...your filter definition as it is now
def filter_queryset(self, request, queryset, view):
return super(ShoppFilter, self).filter_queryset(
request, queryset, view
).distinct()

最新更新