我试图过滤不在我的模型上的序列化值,但我对此一无所知。
这是我的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']
}
有没有一种方法可以对序列化变量而不是模型变量进行过滤?
非常感谢您的帮助!
您不能在过滤器中使用来自序列化器的值。过滤器适用于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
查询参数
这是我的能力:
在我的[[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'),
并且它正在工作...不确定它是否最佳,但是正在工作。
感谢您的帮助!