通过列表过滤多对多字段的字段

我想使用 Django REST Framework 执行以下操作:

根据多对多字段的字段过滤结果。

查询如下所示:https ://endpoint.com/api/artwork/?having_style=Modern,Contemporary

我希望结果包含所有 ArtWork 对象,这些对象包含与名为“Modern”、“Contemporary”或两者的 Style 对象的关系。

下面的代码不起作用,我不知道为什么。

models.py

class Style(models.Model):
    name = models.CharField(validators=[validate_style], max_length=100, unique=True)

class ArtWork(models.Model):
    styles = models.ManyToManyField(Style, default=None)

filters.py

class ArtWorkFilter(filters_rest.FilterSet):
    having_style = django_filters.Filter(field_name="styles__name", lookup_expr='in')

    class Meta:
        model = ArtWork
        fields = ['having_style']
class StyleSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Style
        fields = ('name',)

class ArtWorkSerializer(serializers.ModelSerializer):

    styles = StyleSerializer(many=True)

    class Meta:
        model = ArtWork
        fields = ('styles'/)

views.py

class ArtWorkViewSet(viewsets.ModelViewSet):

    permission_classes = []

    queryset = ArtWork.objects.all()
    serializer_class = ArtWorkSerializer
    filter_backends = [filters_rest.DjangoFilterBackend,]
    filterset_class= ArtWorkFilter
    pagination_class = CursorSetPagination

先感谢您!

解决方案

我通过将 ArtWorkFilter 更改为

filters.py

class ArtWorkFilter(filters_rest.FilterSet):
    having_style = django_filters.Filter(field_name="styles__name", lookup_expr='in')

    class Meta:
        model = ArtWork
        fields = ['having_style']

    def filter_by_style_name(self, queryset, name, value):
        list_styles = value.split(',')
        return queryset.filter(styles__name__in=list_styles)
巴托什·斯塔西亚克

尝试method在过滤器声明中添加参数。就像是:

class ArtWorkFilter(filters_rest.FilterSet):
    having_style = django_filters.Filter(field_name="styles__name", lookup_expr='in')

    class Meta:
        model = ArtWork
        fields = ['having_style']

    def filter_by_style_name(self, queryset, name, value):
        list_styles = value.split(',')
        return queryset.filter(styles__name__in=list_styles)
        

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章