Как написать 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
}
Я хочу написать все типы комбинированных запросов, если кто-то хочет получить информацию только для Fruit, которая является гуавой, то выходные данные будут точными данными только для гуавы.
Кроме того, если кто-то хочет получить информацию только о фруктах, таких как бананы и гуава, то на выходе будут точные данные для бананов и гуавы.
Если фрукт равен банану
на выходе будут данные для банана
Если фрукт равен Guava
на выходе будут данные для гуавы
Если фрукт равен банану и гуаве
на выходе будут данные для банана и гуавы
Кроме того, если кто-то хочет получить информацию только по району, который является Насиком, то выходные данные будут точными данными только по району Насик. Запрос для "Район"
If District невероятно похож на Nasik
На выходе будут данные по Насикскому району
Если District равен Nanded
на выходе будут данные по Нандед Район
аналогично, есть запрос для "Выручка_круга, фермера и т. д."
Я знаю, как написать этот запрос в 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?
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'))
Этот новый запрос возвращает объекты с фруктами "Guava" или "Banana".
Я понимаю, что это может сбить с толку, потому что вы хотите вернуть гуавы и бананы, но воспринимайте это как логическое выражение.
Вы можете заключить это в такую функцию:
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
оператор запроса, означающий, что результат с Farmer больше или равен 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)