How to write python-django queries which is ultimately going to call these queries from django

100 views Asked by At

I want to write all types of complex queries, for example :

If someone wants information "Fruit" is "Guava" in "Pune District" then they will get data for guava in pune district.

htt//api/?fruit=Guava&?district=Pune

If someone wants information "Fruit" is "Guava" in "Girnare Taluka" then they will get data for guava in girnare taluka.

htt://api/?fruit=Guava&?taluka=Girnare

If someone wants information for "Fruit" is "Guava" and "Banana" then they will get all data only for this two fruits, like wise

htt://api/?fruit=Guava&?Banana

But, when I run server then I cant get correct output If i use http://api/?fruit=Banana then I get all data for fruit which is banana, pomegranate, guava instead of get data for fruit is only banana. So I am confuse what happen here. can you please check my code, where I made mistake? *Here is my all files

models.py

class Wbcis(models.Model):

    Fruit = models.CharField(max_length=50)

    District = models.CharField(max_length=50)

    Taluka = models.CharField(max_length=50)

    Revenue_circle = models.CharField(max_length=50)

    Sum_Insured = models.FloatField()

    Area = models.FloatField()

    Farmer = models.IntegerField()                              

def get_wbcis(fruit=None, district=None, talkua=None, revenue_circle=None, sum_insured=None, area=None,min_farmer=None, max_farmer=None, limit=100):

    query = Wbcis.objects.all()

    if fuit is not None:

        query = query.filter(Fruit=fruit)

    if district is not None:

        query = query.filter(District=district)

    if taluka is not None:

        query = query.filter(Taluka=taluka)

    if revenue_circle is not None:

        query = query.filter(Revenue_circle= revenue_circle)

    if sum_insured is not None:

        query = query.filter(Sum_Insured=sum_Insured)

    if area is not None:

        query = query.filter(Area=area)

    if min_farmer is not None:

        query = query.filter(Farmer__gte=min_farmer)

    if max_farmer is not None:

        query = query.filter(Farmer__lt=max_farmer)
    return query[:limit]

Views.py

class WbcisViewSet(ModelViewSet):

    queryset = Wbcis.objects.all()

    serializer_class = WbcisSerializer


def wbcis_view(request):

    fruit = request.GET.get("fruit")

    district = request.GET.get("district")

    taluka = request.GET.get("taluka")

    revenue_circle = request.GET.get("revenue_circle")

    sum_insured = request.GET.get("sum_insured")

    area = request.GET.get("area")

    min_farmer = request.GET.get("min_farmer")

    max_farmer = request.GET.get("max_farmer")

    wbcis = get_wbcis(fruit, district, taluka,revenue_circle,sum_insured,area, min_farmer, max_farmer)


    #convert them to JSON:

    dicts = []

    for wbci in wbcis:

        dicts.append(model_to_dict(wbci))

    return JsonResponse(dicts)

Serializers.py

from rest_framework.serializers import ModelSerializer

from WBCIS.models import Wbcis



class WbcisSerializer(ModelSerializer):


    class Meta:

        model = Wbcis

        fields=('id','Fruit','District','Sum_Insured','Area','Farmer','Taluka','Revenue_circle',)

whats need changes in this code for call these queries to get exact output?

1

There are 1 answers

8
Sayse On

I don't think that you're actually calling that view, judging by your usage I presume you're calling the viewset itself and then ignoring the query params.

You should follow the drf docs for filtering but essentially, provide the get queryset method to your viewset and include the code you currently have in your view in that

class WbcisViewSet(ModelViewSet):

    queryset = Wbcis.objects.all()  # Shouldn't need this anymore

    serializer_class = WbcisSerializer


    def get_queryset(self):

        fruit = self.request.query_params.get("fruit")
        ....
        return get_wbscis(...)