使用Django RestFramework和Angular fronted构建过滤器

使用Django RestFramework和Angular fronted构建过滤器,django,angular,Django,Angular,我尝试从Django后端为我的前端Angular构建一个过滤器,或者如何使用restframework构建过滤器请大家帮助,我在后端有这个 viewset.py from snippets.models import Snippet from .serializers import SnippetSerializer from rest_framework import viewsets from rest_framework.decorators import action from rest

我尝试从Django后端为我的前端Angular构建一个过滤器,或者如何使用restframework构建过滤器请大家帮助,我在后端有这个

viewset.py

from snippets.models import Snippet
from .serializers import SnippetSerializer
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from django_filters  import rest_framework as filters


class SnippetFilter(filters.FilterSet):

    class Meta:
        model = Snippet
        fields = {
            'title': ['icontains'],
            'created': ['iexact', 'lte', 'gte'],
        }


class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    filterset_class = SnippetFilter

    @action(methods=['get'], detail=False)
    def newest(self, request):
        newest = self.get_queryset().order_by('created').last()
        serializer = self.get_serializer_class()(newest)
        return Response(serializer.data)

我显式地创建过滤器。例如,下面的代码将生成
snippets/?snippet\u field\u lte=
snippets/?另一个\u field=
端点

class SnippetFilter(filters.FilterSet):
    snippet_field_lte = NumberFilter(name="snippet_field", lookup_expr="lte")
    another_field = NumberFilter(name="another_field", lookup_expr="exact")

    class Meta:
        model = Snippet
        fields = ["snippet_field_lte", ]

我有同样的情况(Django后端,Angular前端)。不过,我并没有直接使用restframework过滤器,但是,您可以尝试下面的方法,这将允许您使用官方文档中描述的模型进行任何类型的查询

类MyModelViewSet(ViewSet.ModelViewSet):
queryset=MyModel.objects.all()
serializer\u class=MyModelSerializer
def get_queryset(自我):
results=super(MyModelViewSet,self).get_queryset()
#而不是在筛选器中调用显式属性
对于键,self.request.GET.items()中的值:
#我使用从request.GET获得的字典中的键/值对
results=results.filter(**{key:value})#准确地命名为“Jonh Doe”
  • localhost:8000/
    mymodel?name\uu icontains=Jonh%20D
    -->name包含“john D”
  • localhost:8000/
    mymodel?年龄=20
    -->年龄大于20
  • localhost:8000/-->从MyModel返回所有对象