使用 rest framework mongoengine 如何创建查询?
Using restframework mongoengine how to create a 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 区的数据。
不幸的是,我自己还没有尝试过这个解决方案,但是 AFAIK,在带有 SQL 数据库的纯 DRF 中,你会为此使用 Django-Filters package。
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
做同样的事情,但由于它们继承自 GenericView
,我想,它们应该尊重 filter_class
和 filter_backends
参数,也是。
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 区的数据。
不幸的是,我自己还没有尝试过这个解决方案,但是 AFAIK,在带有 SQL 数据库的纯 DRF 中,你会为此使用 Django-Filters package。
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
做同样的事情,但由于它们继承自 GenericView
,我想,它们应该尊重 filter_class
和 filter_backends
参数,也是。