如何在 mongoengine 中使用 django rest 过滤

Alo*_*wal 3 django mongodb mongoengine python-2.7 django-rest-framework

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

我正在使用 rest_framework_mongoengine 来这样做。
我想使用 DjangoFilterBackend 的一个功能。

我的代码是:

模型.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='')
Run Code Online (Sandbox Code Playgroud)

序列化器.py

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


class ClientSerializer(DocumentSerializer):
    class Meta:
        model = Client
        depth = 1
Run Code Online (Sandbox Code Playgroud)

视图.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',)
Run Code Online (Sandbox Code Playgroud)

我开始收到错误 QuerySet object has no attribute model

不知道哪里出错了。如果我删除 filter_field 它有效但我不能使用过滤器功能。

任何帮助都会很有用

Rah*_*pta 6

您还可以通过覆盖该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字典用于过滤查询集。

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
Run Code Online (Sandbox Code Playgroud)

  • 使用通用解决方案更新了 ans。检查它是否有帮助。 (2认同)