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 它有效但我不能使用过滤器功能。
任何帮助都会很有用
您还可以通过覆盖该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)
| 归档时间: |
|
| 查看次数: |
3312 次 |
| 最近记录: |