使用RESTFRAMEWORK MONGOENGINE如何创建Queires



models.py

from mongoengine import Document,  fields
class Tool(Document):
    Fruit = fields.StringField(required=True)
    District = fields.StringField(required=True)
    Area = fields.StringField(required=True)
    Farmer = fields.StringField(required=True)

serializers.py文件

from rest_framework import serializers
from rest_framework_mongoengine.serializers import DocumentSerializer
from models import Tool
class ToolSerializer(DocumentSerializer):
    class Meta:
        model = Tool

views.py文件

from django.template.response import TemplateResponse
from rest_framework_mongoengine.viewsets import ModelViewSet as MongoModelViewSet
from app.serializers import *
def index_view(request):
    context = {}
    return TemplateResponse(request, 'index.html', context)
class ToolViewSet(MongoModelViewSet):
    lookup_field = 'Fruit'
    serializer_class = ToolSerializer
    def get_queryset(self):
        return Tool.objects.all()

所以,我想创建诸如http://127.0.0.1:8000/api/tool/?Fruit=Banana之类的查询,只为我提供水果香蕉的所有数据。另外,http://127.0.0.1:8000/api/tool/?District=Pune仅向我提供Pune District的数据。

不幸的是,我尚未自己尝试过此解决方案,但是在带有SQL数据库的Pure DRF中,您将使用Django-Filters软件包。

有一个类似于DRF-ME的类似物,称为DRF-Mongo-Filters,由DRF-Me的合着者Maxim Vasiliev撰写。它包含一组不错的测试,您可以用于灵感。

基本上,您说的话:

from rest_framework.test import APIRequestFactory
from rest_framework.generics import ListAPIView
from mongoengine import Document, fields
from drf_mongo_filters.filtersets import filters, Filterset, ModelFilterset
from drf_mongo_filters.backend import MongoFilterBackend
class TestFilter(Filterset):
    foo = filters.CharFilter()
class TestView(ListAPIView):
    filter_backends = (MongoFilterBackend,)
    filter_class = TestFilter
    serializer_class = mock.Mock()
    queryset = mock.Mock()
TestView.as_view()(APIRequestFactory().get("/?foo=Foo"))
TestView.queryset.filter.assert_called_once_with(foo="Foo")

尚未尝试使用ViewSet s进行同样的操作,但是由于它们从GenericView继承,我也应该尊重filter_classfilter_backends参数。

最新更新