2014-07-25 7 views
5

मैं इस mysql क्वेरी को django ORM में कैसे बना सकता हूं?कई शामिल फ़ील्ड के साथ Django ORM क्वेरी

SELECT search_products.model, search_products.year, search_products.size, search_avg_price.estimated_price 
FROM search_products 
left JOIN search_avg_price 
ON search_products.model=search_avg_price.model and search_products.size=search_avg_price.size and search_products.year=search_avg_price.year 

मैं पहले से ही

latest_products = Products.objects.all().prefetch_related("avg_price") 

की कोशिश की है, लेकिन इस के रूप में

SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id` 
FROM `search_products` 

और

latest_products = Products.objects.all().select_related("avg_price") 

Django द्वारा अनुवाद किया है इस के रूप में Django द्वारा अनुवाद किया है:

+०१२३५१६४१०६
SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id`, `search_avg_price`.`id`, `search_avg_price`.`model`, `search_avg_price`.`size`, `search_avg_price`.`year`, `search_avg_price`.`estimated_price` 
FROM `search_products` 
INNER JOIN `search_avg_price` ON (`search_products`.`avg_price_id` = `search_avg_price`.`id`) 

अगर मैं डेटाबेस मैं उचित परिणाम प्राप्त में ऊपर एसक्यूएल चलाने ...

संपादित करें: मॉडल और विचारों

class Avg_price(models.Model): 
model = models.CharField(max_length=50, blank=True) 
size= models.IntegerField(blank=True, null=True) 
year= models.IntegerField(blank=True, null=True) 
estimated_price= models.IntegerField(blank=True, null=True) 

class Products(models.Model): 
product_id =models.IntegerField(blank=True, null=True) 
link_id = models.CharField(max_length=200, blank=True) 
location = models.CharField(max_length=200, blank=True) 
model = models.CharField(max_length=50, blank=True) 
size= models.IntegerField(blank=True, null=True) 
price= models.IntegerField(blank=True, null=True) 
year= models.IntegerField(blank=True, null=True) 
type=models.ForeignKey(Type) 
avg_price = models.ForeignKey(Avg_price) 

def __unicode__(self): # Python 3: def __str__(self): 
    return self.location 

खाका

{% if latest_products %} 
    {% for product in latest_products %} 
    <ul> 
    <li id="col_one"> 
     <h5>{{product.avg_price.estimated_price}}</h5> 
     <h5>{{product.model}}</h5> 
+0

आप नहीं करते इसके लिए 'select_related' या' prefetch_related' चाहते हैं, आप अन्य मॉडल से जुड़ने के लिए फ़िल्टर का उपयोग करना चाहते हैं, एक विदेशी कुंजी या कई रिश्ते में कई मानते हैं। क्या आप अपना मॉडल कोड पोस्ट कर सकते हैं? – Tom

उत्तर

1

क्वेरी आज़माएं इस तरह:

qs = Product.objects.filter(
    avg_price__model__isnull=True).filter(
    avg_price__size__isnull=True).filter(
    avg_price__year__isnull=True).values_list(
    'model', 'year', 'size', 'avg_price__estimated_price') 

परीक्षण करने के लिए:

print(qs.query) 

स्पष्टीकरण:

अपने उत्पाद मॉडल से, आप avg_price पर ForeignKey हर बार और है कि मॉडल है कि आप हर बार जब आप वापस NULL होना चाहता हूँ में रिश्तेदार क्षेत्र तक पहुँच रहे हैं LEFT JOIN पर आधारित क्वेरी। यहाँ देखो अप है कि रिश्तों अवधि पर दस्तावेज़ीकरण है:

https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

फिर values_list आइए आप जो वापस जाने के लिए मान निर्दिष्ट। यहाँ values_list पर दस्तावेज़ीकरण है:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

+0

मैंने कोशिश की और त्रुटि प्राप्त की: "फील्ड एरर: कीवर्ड 'avg_price.estimated_price' फ़ील्ड में हल नहीं कर सकता"। ऐसा लगता है कि django अन्य तालिका को देखने में सक्षम नहीं है ... इसके अलावा मुझे टेबल उत्पादों से सभी परिणाम दिखाना होगा और जब भी उपस्थित हो, तालिका avg_price से परिणाम जोड़ें (वर्ष का मॉडल, मॉडल और आकार) ... धन्यवाद मदद – user2950162

+0

'avg_price.estimated_price' के बजाय' avg_price__estimated_price' के साथ कैसे? –

+0

परिणामस्वरूप क्वेरी उस व्यक्ति से अलग है जिसे मैं बनाना चाहता हूं ... चुनें 'search_productsmodel', 'search_products'.year',' search_products'.ize', 'search_avg_price'.estestated_price' ' search_products' INNER से जॉइन 'search_avg_price' चालू करें (' search_products'.avav_price_id' = 'search_avg_price'.'id') कहां (' search_avg_price'.mmodel' शून्य है और 'search_avg_price'.ize' है नल और 'search_avg_price'। वर्ष 'पूरा है) – user2950162

1

आप विधि अतिरिक्त() को टेबल सूची गुजरती हैं और करने के लिए अपने एसक्यूएल क्वेरी के पर से स्थिति डाल सकते हैं जहां में अनुभाग अतिरिक्त()

Product.objects.extra(
    tables=['search_avg_price'], 
    where=[ 
     '"search_products"."model"="search_avg_price"."model"', 
     '"search_products"."size"="search_avg_price"."size"', 
     '"search_products"."year"="search_avg_price"."year"' 
    ] 
) 

के बारे में अतिरिक्त अधिक पढ़ सकते हैं: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#extra

संबंधित मुद्दे