Как написать запросы python-django и импортировать их?

Данные:

{
  "Fruit": "Pomegranate",
  "District": "Nasik",
  "Taluka": "Nasik",
  "Revenue circle": "Nasik",
  "Sum Insured": 28000,
  "Area": 1200,
  "Farmer": 183
}

{
  "Fruit": "Pomegranate",
  "District": "Jalna",
  "Taluka": "Jalna",
  "Revenue circle": "Jalna",
  "Sum Insured": 28000,
  "Area": 120,
  "Farmer": 13
}

{
  "Fruit": "Guava",
  "District": "Pune",
  "Taluka": "Haveli",
  "Revenue circle": "Uralikanchan",
  "Sum Insured": 50000,
  "Area": 10,
  "Farmer": 100
}

{
  "Fruit": "Guava",
  "District": "Nasik",
  "Taluka": "Girnare",
  "Revenue circle": "Girnare",
  "Sum Insured": 50000,
  "Area": 75,
  "Farmer": 90
}

{
  "Fruit": "Banana",
  "District": "Nanded",
  "Taluka": "Nandurbar",
  "Revenue circle": "NandedBK",
  "Sum Insured": 5000,
  "Area": 2260,
  "Farmer": 342
}

{
  "Fruit": "Banana",
  "District": "Jalgaon",
  "Taluka": "Bhadgaon",
  "Revenue circle": "Bhadgaon",
  "Sum Insured": 5000,
  "Area": 220,
  "Farmer": 265
}

Я хочу написать все типы комбинированных запросов, если кому-то нужна информация только для фруктов, которые являются гуавой, то на выходе будут точные данные только для гуавы.

также, если кому-то нужна информация только для фруктов, то есть бананов и гуавы, то на выходе будут точные данные для бананов и гуавы.

Если фрукт равен банану

на выходе будут данные для Banana

Если фрукты равны гуаве

на выходе будут данные для Гуавы

Если фрукты равны банану и гуаве

на выходе будут данные для банана и гуавы

Кроме того, если кому-то нужна информация только для округа Насик, то на выходе будут точные данные только для района Насик. Запрос «Район»

Если Район равен Насику

на выходе будут данные по Насикскому району

Если District равен Nanded

выходными данными будут данные для округа Нандед.

аналогично, есть запрос для «Revenue_circle, Farmer и т. д.

Я знаю, как писать эти запросы в mongoshell, используя find

db.Wbcis.find({"Фрукты":"Банан"})

db.Wbcis.find({"Район":"Насик"}) и т.д...

но я хочу писать запросы в скрипте Python, поэтому я запутался в файлах models.py и views.py.

Я устал и набираю запрос, используя объекты Q в models.py

models.py

from django.contrib.auth.models import User

from django.db import models

from django.db.models import Q

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 __str__(self):

    return self.Fruit

def save(self, *args, **kwargs):

    super().save(*args, **kwargs)

class Meta:

  verbose_name_plural = 'wbcis'

from models import Wbcis
Guava =Wbcis.objects.filter(Q(Fruit='Guava'))
print Guava
Banana= Wbcis.objects.filter(Q(Fruit='Banana'))
print Banana  
Pomegranate= Wbcis.objects.filter(Q(Fruit='Pomegranate'))   
print Pomegranate
Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava')&Q(Fruit='Banana'))   
print Guava_Banana

Но я знаю, что это неправильный способ запроса. Мне нужно написать это в цикле for или в цикле while. не могли бы вы помочь мне, как написать этот запрос, используя цикл for?


person Kiran Prajapati    schedule 21.12.2016    source источник


Ответы (1)


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

Я думаю, что вы имеете в виду с вашим циклом for, что вы можете перебирать запрос (технически, QuerySet), чтобы получить результаты.

Например:

Guava = Wbcis.objects.filter(Q(Fruit='Guava'))
for guava_entry in Guava:
    # Do something with the returned element here:
    print guava_entry

Если вы хотите отфильтровать по нескольким параметрам, вы можете просто указать несколько условий в своем фильтре. Например, чтобы получить Бананы в Нандеде

Guava = Wbcis.objects.filter(Fruit="Banana", District="Nanded")

Вам не нужно использовать цикл for для этого. По умолчанию filter объединяет ваши условия с помощью and. Это означает, что в приведенном выше примере Fruit должен быть "Banana", и District должен быть "Nanded".

Глядя на примеры, которые у вас есть в вашем вопросе, у вас есть этот запрос:

Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava')&Q(Fruit='Banana'))   

Этот запрос никогда не вернет никаких результатов. Он запрашивает объект, который имеет как плод "гуава" , так и плод "банан". Вместо этого вы хотите следующее:

Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava') | Q(Fruit='Banana'))

Этот новый запрос возвращает объекты, в которых фруктом является «гуава» или «банан».

Я понимаю, что это может сбивать с толку, потому что вы хотите вернуть Guavas и Bananas, но думайте об этом как о логическом выражении.

Вы можете обернуть это в функцию следующим образом:

def get_wbcis(fruit=None, district=None, talkua=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 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]

Параметр limit гарантирует, что будет возвращено максимальное количество результатов.

min_farmer в этом примере использует оператор запроса __gte, что означает, что будут возвращены результаты с фермером, большим или равным min_farmer.

max_farmer использует оператор __lt, поэтому будут возвращены результаты с фермером ниже, но не равным max_farmer.

Точно так же вы можете использовать __gt или __lte, если вам нужны разные фильтры неравенства.

Ваш views.py может сделать что-то вроде этого:

import json
from django.forms.models import model_to_dict
from django.http import JsonResponse
from models import get_wbcis

def wbcis_view(request):
    fruit = request.GET.get("fruit")
    district = request.GET.get("district")
    taluka = request.GET.get("taluka")
    min_farmer = request.GET.get("min_farmer")
    max_farmer = request.GET.get("max_farmer")

    wbcis = get_wbcis(fruit, district, taluka, min_farmer, max_ffarmer)

    #convert them to JSON:
    dicts = []
    for wbci in wbcis:
        dicts.append(model_to_dict(wbci))

    return JsonResponse(dicts)
person bigblind    schedule 21.12.2016
comment
да, я хочу повторить запрос. предположим, мы хотим вывести данные для какого-то фрукта в какую-то талуку, тогда как написать запрос? - person Kiran Prajapati; 21.12.2016
comment
Итак, нам нужно писать все запросы в этой форме? для округа = Пуна для округа = Насик .... так далее? или с помощью цикла for мы можем это сделать? - person Kiran Prajapati; 21.12.2016
comment
Вы хотите сгруппировать фрукты по районам? Так например получить все фрукты в Пуне, потом все фрукты в Насике и так далее? - person bigblind; 21.12.2016
comment
да . точно... предположим, мне нужны данные о банановых фруктах в нандедском районе, тогда вывод дает мне ответ. или если кому-то нужны данные о фруктах гуавы в районе Насик, то выходные данные дают мне ответ - person Kiran Prajapati; 21.12.2016
comment
да, это полезно, поэтому мне нужно написать все типы запросов в файле models.py, чтобы назвать его этим запросом, который мне нужно написать в файле views.py? если кому-то нужна информация для punedistrict -выберите taluka --uralikanchan и выберите fruit --banana , то вывод даст именно это http:127.0.0.1:8000/api/?District=Pune&?Taluka=uralikanchan&Fruit=Banana - person Kiran Prajapati; 21.12.2016
comment
да ... фрукты - это либо гуава, либо банан. Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava') | Q(Fruit='Banana')) это я хочу.. - person Kiran Prajapati; 21.12.2016
comment
Вы можете обернуть свой запрос в функцию, которую вы можете вызвать из своего представления. Смотрите мой обновленный ответ для информации. - person bigblind; 21.12.2016
comment
Итак, эту функцию мне нужно прописать в файле views.py? если кто-то использует Taluka вместо района, чтобы найти фрукты. тогда что нам делать? например: в талука: хавели, сколько фруктов сделано? поэтому нам нужно использовать Taluka вместо District в функции переноса? - person Kiran Prajapati; 21.12.2016
comment
Вы можете разместить эту функцию где угодно, но я бы поместил ее в models.py, и тогда ваше представление сможет ее вызывать. Чтобы добавить дополнительные критерии поиска, вы можете просто добавить параметры к своей функции. - person bigblind; 21.12.2016
comment
О, хорошо, сэр, так что мы можем добавить больше параметров аналогичным образом. затем сопоставьте эти 3 критерия параметров и покажите точный ответ, я запутался. как написать этот тип запроса, - person Kiran Prajapati; 21.12.2016
comment
Я только что обновил свой ответ, указав больше параметров функции, так что да, вы можете расширить это до farmer, profit_circle и т. д. Я не уверен, что вы имеете в виду, если их больше 100, а затем соответствовать этим трем критериям параметров. В текущей версии он просто будет соответствовать каждому параметру, который вы передаете, и даст вам точный результат. Если вы хотите ограничить количество возвращаемых результатов, вы можете поставить [:100] после запроса. (обновление моего ответа...) - person bigblind; 21.12.2016
comment
например: мы хотим показать выходные данные, где фермер меньше 100 в наших данных. Таким образом, мы можем получить вывод данных 2 из 6. Например, Q(farmer_lt=100) показывает только 2 вывода, что строго меньше 100 фермеров. но есть некоторые конкретные критерии, которые в округе => Насик, сколько данных дает фермерам меньше 100, чтобы сделать фрукты ==> Гуава. - person Kiran Prajapati; 21.12.2016
comment
Вы можете использовать Farmer__lt=100 для фильтрации фермеров ниже 100. Я обновил свой ответ. При этом вы можете сказать 127.0.0.1/api/?district=Nasik&fruit=Guava&max_farmer=100, чтобы получить приведенный вами пример. - person bigblind; 21.12.2016
comment
большое тебе спасибо. это действительно полезно для меня..!! :) - person Kiran Prajapati; 21.12.2016
comment
Если мы хотим отфильтровать по нескольким параметрам, например, Области получения бананов в Нандед-Гуава = Wbcis.objects.filter(Area_lt=100,Фрукты=Банан, Район=Нандед), правильно ли это? - person Kiran Prajapati; 21.12.2016