Django Rest Framework +序列化值上的django_filters

问题描述 投票:0回答:2

我试图过滤不在我的模型上的序列化值,但我对此一无所知。

这是我的model.py

class Post(models.Model):
    post_id_number=models.AutoField(primary_key=True)
    variable_1 = models.CharField(max_length=50)
    variable_2 = models.CharField(max_length=50)
    variable_3 = models.CharField(max_length=50)

这是我的Views.py

class PostViewSet(viewsets.ModelViewSet):
    serializer_class = PostSerializers
    queryset = Post.objects.all()
    filterset_class = PostFilter

这是我的serializers.py

class PostSerializers(serializers.ModelSerializer):

    variable_not_in_the_model = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('post_id_number',
            'variable_1', 
            'variable_2', 
            'variable_3', 
            'variable_not_in_the_model',
            )

    def get_variable_not_in_the_model(self, instance):
        return instance.variable_1 + ' ' + instance.variable_2 + ' ' + instance.variable_3

这是我的实际filters.py

from .models import Post
import django_filters

class PostFilter(django_filters.FilterSet):
    class Meta:
        model = Post
        fields = {
            'variable_1': ['icontains'],
            'variable_2': ['icontains'],
            'variable_3': ['icontains']
        }

这是我希望我的filters.py看起来像的样子,但这不起作用:

from .models import Post
import django_filters

class PostFilter(django_filters.FilterSet):
    class Meta:
        model = Post
        fields = {
            'variable_not_in_the_model': ['icontains']
        }

有没有一种方法可以对序列化变量而不是模型变量进行过滤?

非常感谢您的帮助!

django django-rest-framework django-filter
2个回答
0
投票

您不能在过滤器中使用来自序列化器的值。过滤器适用于model / db字段。但是您可以自己构建自定义查询集。如果您只想检查该值是否在前三个变量之一中,则可以尝试以下操作:

import django_filters

from .models import Post


class PostFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search')

    class Meta:
        model = Post

    def filter_search(self, qs, name, value):
        if value:
            return qs.filter((
                Q(variable_1__icontains=value) |
                Q(variable_2__icontains=value) |
                Q(variable_3__icontains=value)
            ))
        return qs

然后在您的API调用中添加?search=something查询参数


0
投票

这是我的能力:

在我的[[views.py中,我创建了一个新的视图(由于必须创建一个新的URL,所以不确定它是理想的,但是由于我使用的是视图集,所以我无法做到这一点)]

class PostAPIView(ListAPIView): serializer_class = PostSerializers def get_queryset(self, *args, **kwargs): #queryset_list = super(PostAPIView, self).get_queryset(*args, **kwargs) queryset_list = Post.objects.all() query = self.request.GET.get("q") if query: queryset_list = queryset_list.filter( Q(variable_1__icontains=query) | Q(variable_2__icontains=query) | Q(variable_3__icontains=query) ).distinct() return queryset_list
在我的[[urls.py
中,我添加了:

path('api/filter/', PostAPIView.as_view(), name='test'), 并且它正在工作...不确定它是否最佳,但是正在工作。

感谢您的帮助!    
© www.soinside.com 2019 - 2024. All rights reserved.