如何使用带有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
您好,我正在使用 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