数据:
{
"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
}我想要写所有类型的组合查询,如果有人只想要水果的信息--即番石榴--那么输出将仅仅是番石榴的精确数据。
另外,如果有人只想要水果的信息,即香蕉和番石榴,那么输出将是香蕉和番石榴的精确数据。
如果水果等于香蕉
输出将是香蕉的数据
如果水果等于番石榴
输出将是番石榴的数据
如果水果等于香蕉和番石榴
输出将是香蕉和番石榴的数据。
另外,如果有人只想要地区的信息,也就是Nasik,那么输出将是Nasik地区的精确数据。对“地区”的质疑
如果地区等于Nasik
输出将是Nasik区的数据
如果区与南德相等
输出为南德地区的数据
同样,还有对"Revenue_circle、Farmer等“的查询。
我知道如何使用find在mongoshell中编写这个查询。
Db.Wbcis.find({“水果”:“香蕉”})
Db.Wbcis.find({“地区”:“Nasik”})等。
但是我想用python脚本编写查询,所以我对models.py和views.py文件感到困惑。
我厌倦了在models.py中使用Q对象输入查询
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循环编写这个查询吗?
发布于 2016-12-21 10:11:46
我不知道你想要什么,但你的询问似乎是对的。
我认为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组合条件。这意味着在上面的例子中,水果必须是“香蕉”,和地区必须是“南方”。
查看您在问题中的示例,您有以下查询:
Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava')&Q(Fruit='Banana')) 此查询将永远不会返回任何结果。它要求一个同时拥有“番石榴”果实和“香蕉”果实的物体。你想要的是:
Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava') | Q(Fruit='Banana'))此新查询返回水果为“番石榴”或“香蕉”的对象。
我理解这可能会让人感到困惑,因为您希望返回Guavas 和香蕉,但是可以将其看作一个布尔表达式。
您可以将它包装成这样的函数:
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查询运算符,这意味着将返回与FarmerGreather大于或等于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)https://stackoverflow.com/questions/41259961
复制相似问题