如何使用带有mongoengine的django rest过滤

how to use django rest filtering with mongoengine

您好,我正在使用 mongodb 启动 django 1.8.3,使用 mongo 引擎创建 rest api。

我正在使用 rest_framework_mongoengine 这样做。
我想使用 DjangoFilterBackend 的一个特性。

我的代码是:

models.py:

from mongoengine import *    
from django.conf import settings    
connect(settings.DBNAME)

class Client(Document):
    name = StringField(max_length=50)
    city = StringField(max_length=50)
    country = StringField(max_length=200, verbose_name="Country")
    address = StringField(default='')

Serializer.py

from client.models import Client    
from rest_framework_mongoengine.serializers import DocumentSerializer    


class ClientSerializer(DocumentSerializer):
    class Meta:
        model = Client
        depth = 1

views.py

from rest_framework_mongoengine.generics import *    
from rest_framework import filters    


class ClientList(ListCreateAPIView):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('name',)

我开始出错 QuerySet 对象没有属性模型

不知道哪里出错了。如果我删除 filter_field 它可以工作,但我不能使用过滤器功能。

任何帮助都会有很大用处

您还可以通过覆盖 get_queryset() 方法并创建通用过滤函数来执行过滤。

在这里,我们将视图中的筛选字段元组指定为my_filter_fields,我们要对其执行筛选。然后在我们的get_queryset()中调用一个函数get_kwargs_for_filtering()

get_kwargs_for_filtering() 函数遍历 my_filter_fields 中定义的字段并检查它是否在 query_params 中传递。如果找到该字段,则在字典 filtering_kwargs 中设置具有字段名称和值作为检索值的键。迭代结束后,这个filtering_kwargs字典返回给get_queryset()方法。

这个filtering_kwargs字典用来过滤queryset。

from rest_framework_mongoengine.generics import *    
from rest_framework import filters    


class ClientList(ListCreateAPIView):
    serializer_class = ClientSerializer
    my_filter_fields = ('name', 'country') # specify the fields on which you want to filter

    def get_kwargs_for_filtering(self):
        filtering_kwargs = {} 
        for field in  self.my_filter_fields: # iterate over the filter fields
            field_value = self.request.query_params.get(field) # get the value of a field from request query parameter
            if field_value: 
                filtering_kwargs[field] = field_value
        return filtering_kwargs 

    def get_queryset(self):
        queryset = Client.objects.all() 
        filtering_kwargs = self.get_kwargs_for_filtering() # get the fields with values for filtering 
        if filtering_kwargs
            queryset = Client.objects.filter(**filtering_kwargs) # filter the queryset based on 'filtering_kwargs'
        return queryset

这是完成这项工作的好方法。 首先,你应该安装 django_mongoengine_filter rest_framework_mongoengine

pip install django_mongoengine_filter 
pip install rest_framework_mongoengine

其次,你可以这样写你的所有者过滤器:

import django_mongoengine_filter as filters

from app.models import User

class UserFilter(filters.FilterSet):
    class Meta:
        model = User
        fields = ['name']

最后,您可以在视图中像这样使用 UserFilter class:

from app.models import User
from app.serializer import UserS  # use rest_framework_mongoengine to write serializer
from app.filters import UserFilter


class UserVS(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserS
    # override filter_queryset function
    def filter_queryset(self, queryset):
        filter = UserFilter(self.request.query_params, queryset=queryset)
        return filter.qs