如何编写 python-django queires 并导入它们?
How to write python-django queires and import them?
数据:
{
"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
}
我想编写所有类型的组合查询,如果有人只需要有关番石榴的水果的信息,那么输出将仅为番石榴的准确数据。
另外,如果有人只需要有关水果(香蕉和番石榴)的信息,那么输出将是香蕉和番石榴的准确数据。
如果水果等于香蕉
输出将是香蕉的数据
如果水果等于番石榴
输出将是 Guava 的数据
如果水果等于香蕉和番石榴
输出将是 Banana 和 Guava 的数据
另外,如果有人只想要 Nasik 地区的信息,那么输出将只是 Nasik 地区的准确数据。查询 "District"
如果 District 等于 Nasik
输出将是 Nasik 区的数据
如果 District 等于 Nanded
输出将是 Nanded 区的数据
同样,查询“Revenue_circle,Farmer 等
我知道如何使用 find
在 mongoshell 中编写此查询
db.Wbcis.find({"Fruit":"Banana"})
db.Wbcis.find({"District":"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 循环编写这个查询吗?
我不确定你想要什么,但你的查询似乎是正确的。
我认为您的 for
循环的意思是您可以迭代查询(从技术上讲,QuerySet
)以获得结果。
例如:
Guava = Wbcis.objects.filter(Q(Fruit='Guava'))
for guava_entry in Guava:
# Do something with the returned element here:
print guava_entry
如果您想按多项进行过滤,您可以在过滤器中设置多个条件。例如,在 Nanded
中获取 Bananas
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'))
此查询永远不会 return 任何结果。它要求一个对象同时具有 "Guava" 的 Fruit 和 "Banana" 的 Fruit。你想要的是:
Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava') | Q(Fruit='Banana'))
这个新查询 returns 对象,其中 fruit 是 "Guava" 或 "Banana"。
我知道这可能会造成混淆,因为您想 return 番石榴 和 香蕉,但请将其视为布尔表达式。
您可以将其包装在这样的函数中:
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
参数确保最多 returned 的结果。
本例中的 min_farmer 使用 __gte
查询运算符,这意味着 Farmer 大于或等于 min_farmer
的结果将被 returned.
max_farmer 使用 __lt 运算符,因此农民低于但不等于 max_farmer
的结果将被 returned.
同样,如果您想要不同的不等式过滤器,您可以使用 __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)
数据:
{
"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
}
我想编写所有类型的组合查询,如果有人只需要有关番石榴的水果的信息,那么输出将仅为番石榴的准确数据。
另外,如果有人只需要有关水果(香蕉和番石榴)的信息,那么输出将是香蕉和番石榴的准确数据。
如果水果等于香蕉
输出将是香蕉的数据
如果水果等于番石榴
输出将是 Guava 的数据
如果水果等于香蕉和番石榴
输出将是 Banana 和 Guava 的数据
另外,如果有人只想要 Nasik 地区的信息,那么输出将只是 Nasik 地区的准确数据。查询 "District"
如果 District 等于 Nasik
输出将是 Nasik 区的数据
如果 District 等于 Nanded
输出将是 Nanded 区的数据
同样,查询“Revenue_circle,Farmer 等
我知道如何使用 find
在 mongoshell 中编写此查询db.Wbcis.find({"Fruit":"Banana"})
db.Wbcis.find({"District":"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 循环编写这个查询吗?
我不确定你想要什么,但你的查询似乎是正确的。
我认为您的 for
循环的意思是您可以迭代查询(从技术上讲,QuerySet
)以获得结果。
例如:
Guava = Wbcis.objects.filter(Q(Fruit='Guava'))
for guava_entry in Guava:
# Do something with the returned element here:
print guava_entry
如果您想按多项进行过滤,您可以在过滤器中设置多个条件。例如,在 Nanded
中获取 BananasGuava = 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'))
此查询永远不会 return 任何结果。它要求一个对象同时具有 "Guava" 的 Fruit 和 "Banana" 的 Fruit。你想要的是:
Guava_Banana=Wbcis.objects.filter(Q(Fruit='Guava') | Q(Fruit='Banana'))
这个新查询 returns 对象,其中 fruit 是 "Guava" 或 "Banana"。
我知道这可能会造成混淆,因为您想 return 番石榴 和 香蕉,但请将其视为布尔表达式。
您可以将其包装在这样的函数中:
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
参数确保最多 returned 的结果。
min_farmer 使用 __gte
查询运算符,这意味着 Farmer 大于或等于 min_farmer
的结果将被 returned.
max_farmer 使用 __lt 运算符,因此农民低于但不等于 max_farmer
的结果将被 returned.
同样,如果您想要不同的不等式过滤器,您可以使用 __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)