Как писать запросы python-django, которые в конечном итоге будут вызывать эти запросы из django

Я хочу написать все типы сложных запросов, например:

Если кому-то нужна информация о том, что «Фрукты» — это «Гуава» в «Районе Пуны», они получат данные о гуаве в округе Пуна.

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

Если кому-то нужна информация «Фрукты» — это «Гуава» в «Girnare Taluka», они получат данные для гуавы в girnare taluka.

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

Если кому-то нужна информация о «Фруктах», это «Гуава» и «Банан», тогда они получат все данные только для этих двух фруктов, как и мудро.

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

Но когда я запускаю сервер, я не могу получить правильный вывод. Если я использую http://api/?fruit=Banana, я получаю все данные для фруктов, таких как банан, гранат, гуава, вместо того, чтобы получать данные для фруктов, это только банан. Поэтому я смущен тем, что здесь происходит. не могли бы вы проверить мой код, где я допустил ошибку? *Вот мои все файлы

модели.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)

Сериализаторы.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',)

что нужно изменить в этом коде для вызова этих запросов, чтобы получить точный результат?


person Kiran Prajapati    schedule 22.12.2016    source источник
comment
Я удалил код, который, по моему мнению, не имел отношения к вопросу (то же самое для данных), если вы считаете, что что-то было удалено неправильно, не стесняйтесь откатиться и отформатировать свой вопрос.   -  person Sayse    schedule 22.12.2016
comment
да. теперь все в порядке,   -  person Kiran Prajapati    schedule 22.12.2016
comment
У вас опечатка в get_wbcis - if fuit is not None:   -  person Sayse    schedule 22.12.2016
comment
Вижу, меняю, но все равно не получаю точной информации, чего мы хотим   -  person Kiran Prajapati    schedule 22.12.2016


Ответы (1)


Я не думаю, что вы на самом деле вызываете это представление, судя по вашему использованию, я предполагаю, что вы вызываете сам набор представлений, а затем игнорируете параметры запроса.

Вы должны следовать документам drf для фильтрации, но по существу, предоставьте метод get queryset вашему набору представлений и включите в него код, который у вас есть в данный момент в вашем представлении.

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(...)
person Sayse    schedule 22.12.2016
comment
Хорошо, поэтому мне нужно включить этот код в файл views.py и удалить def wbcis_view(request): этот код? - person Kiran Prajapati; 22.12.2016
comment
@KiranPrajapati - я так думаю, измените свой ModelViewSet, чтобы использовать get_queryset, который делает то, что делало начало этого представления, вам также больше не нужна строка queryset, о которой я упоминал здесь. - person Sayse; 22.12.2016
comment
Ладно, я все пытаюсь, чтобы вы дали ссылку на drf docs. У меня есть один вопрос, если мы хотим писать все типы запросов, которые в конечном итоге вызывают django. так что rest-framework-filter - это только один способ, верно? - person Kiran Prajapati; 22.12.2016
comment
@KiranPrajapati - я не понял ваш последний комментарий, если вы имеете в виду, есть ли общий способ написать этот код, то это настоящая причина, по которой я связал документацию, поскольку есть части, в которых говорится о FilterBackends ... но если у вас есть еще один вопрос, который вы действительно должны задать как новый вопрос с тем, что вы пробовали и исследовали - person Sayse; 22.12.2016
comment
например: предположим, что кому-то нужна информация: api/?fruit=banana, тогда нам не нужно писать какой-либо другой python script, если мы уже используем в файле views.py def get_query(self): это правильно? - person Kiran Prajapati; 22.12.2016
comment
Я все еще не понимаю, метод get_queryset должен быть всем, что вам нужно написать, чтобы сделать это в настоящее время. - person Sayse; 22.12.2016
comment
хорошо, если мы используем набор get_query, тогда нам не нужно использовать объект Q? - person Kiran Prajapati; 22.12.2016
comment
@KiranPrajapati - Пожалуйста, попробуйте сначала... Я не вижу, где Q объекты входят в это - person Sayse; 22.12.2016