0

데이터 : 누군가는 구아바 다음 출력은 구아바에 대한 정확한 데이터가 될 것입니다 과일에 대한 정보를 원하는 경우python-django queires를 작성하고 가져 오는 방법은 무엇입니까?

{ 
    "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 교육구의 정확한 데이터가됩니다. "구역"에 대한 질의

경우 구는

출력 시크 지구에 대한 데이터가 될 것이다 시크 같다

구는 데드 같으면

출력

데드 구역 데이터 것

마찬가지로 "Revenue_circle, Farmer 등"에 대한 쿼리가 있습니다.

나는이 쿼리를 mongoshell에 쓰는 방법을 알고 있습니다. ING ({ "과일" "바나나"})

db.Wbcis.find 찾을

db.Wbcis.find ({ "지구" "시크"}) 등 ...

하지만 나는 python 스크립트에 쿼리를 작성하여 models.py와 views.py 파일을 혼동하고 싶습니다.

I 그러나 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 

을 Q 개체를 사용하여 피곤을 입력 쿼리, 나는이 쿼리에 대한 올바른 방법이 아니다 알고있다. for 루프 또는 while 루프에 이것을 작성해야합니다. 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 

여러 가지로 필터링하려면 필터에 여러 조건을 막을 수 있습니다. 예를 들어, 난 데드

당신은이에 대한 for 루프를 사용할 필요가 없습니다
Guava = Wbcis.objects.filter(Fruit="Banana", District="Nanded") 

에 바나나를 얻을 수 있습니다. 기본적으로 filterand을 사용하여 조건을 결합합니다. 이는 위의 예에서 과일이 "바나나", 이어야하며 "Nanded"여야 함을 의미합니다.

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 쿼리 연산자를 사용합니다. 즉, 농부가 min_farmer 이상인 결과가 반환됩니다.

max_farmer는 __lt 연산자를 사용하므로 농부가 0보다 작고 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) 
+0

가 그래 난 쿼리를 반복 할을. 어떤 탈루 카에서 과일에 대한 데이터를 출력하고 쿼리를 작성하는 방법을 원한다고 가정 해 봅시다. –

+0

그래서 모든 쿼리를이 형식으로 작성해야합니까? 지구 = 푸네 지구 = Nasik .... 등등? for 루프를 사용하면이 작업을 수행 할 수 있습니까? –

+1

지구별로 과일을 그룹화 하시겠습니까? 예를 들어 푸네의 모든 과일을 먹은 다음 나식의 모든 과일을 가져다주는 식 으로요? – bigblind