3

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 file

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 file

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()

So,I want to create queries like http://127.0.0.1:8000/api/tool/?Fruit=Banana gives me all data for fruit banana only. Also, http://127.0.0.1:8000/api/tool/?District=Pune gives me data for Pune district only .

Jaap
  • 81,064
  • 34
  • 182
  • 193
Kiran Prajapati
  • 191
  • 2
  • 18
  • Maybe a more up to date answer here: https://stackoverflow.com/questions/31646858/how-to-use-django-rest-filtering-with-mongoengine – Ouss Nov 22 '22 at 13:35

1 Answers1

1

Unfortunately, I haven't tried this solution myself yet, but AFAIK, in pure DRF with SQL database you'd use Django-Filters package for this.

There's an analogue of it for DRF-ME, called drf-mongo-filters, written by Maxim Vasiliev, co-author of DRF-ME. It contains a decent set of tests, you could use for inspiration.

Basically, you say something like:

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")

Haven't tried doing the same with ViewSets, but as they inherit from GenericView, I guess, they should respect filter_class and filter_backends parameters, too.

Boris Burkov
  • 13,420
  • 17
  • 74
  • 109