2011-08-14 13 views
6

मैं एक प्रबंधन कमांड लिख रहा हूं जो सुझाए गए मूल्यों के साथ किसी उत्पाद की मूल कीमत को फ़िल्टर करेगा।मैं किसी प्रश्न के मॉडल के दो फ़ील्ड की तुलना कैसे कर सकता हूं?

class Suggestion(models.Model): 
    .... 
    price = models.IntegerField() 

class Product(models.Model): 
    price = models.IntegerField() 
    suggestions = models.ManyToManyField(Suggestion) 

मैं सभी उत्पादों जिसका मूल्य न्यूनतम भी सुझाव के बराबर है फ़िल्टर करना चाहते हैं:

मैं एक उत्पाद मॉडल है जो लगता है कि है। कुछ की तरह करना चाहिए:

Product.objects.filter(price = minumum(suggestions)) 

और

मैं उत्पादों जहां सुझाव उत्पाद की मूल कीमत शामिल फ़िल्टर करना चाहते हैं। कुछ की तरह करना चाहिए:

Product.objects.filter(price__in = self.suggestions) 

समस्या मैं एक प्रत्येक उत्पाद के न्यूनतम भी सुझाव देखने के लिए और आप अनुमान लगा के रूप में मैं या तो वस्तु की स्वयं उपयोग नहीं कर सकते, तो कैसे मैं दो तुलना कर सकते हैं पाश के लिए उपयोग नहीं कर सकते है एक प्रश्न में एक मॉडल के क्षेत्र?

उत्तर

8
from django.db.models import F 
Product.objects.filter(price__in=F('suggestions')) 
+1

धन्यवाद! यह अच्छी तरह से काम करता है। फिर भी, एक छोटी सी त्रुटि है: एफ ('सुझाव') के अंदर उद्धरण चिह्नों में सुझाव होना चाहिए। –

2
  • Product.objects.filter(price = minumum(suggestions))

suggestions उत्पाद पर एक क्षेत्र (और स्तंभों F के लिए पारित उद्धरण होना चाहिए, F('suggestions') नहीं F(suggestions)) की तरह नहीं है। तो यह अच्छा नहीं है।

इसके लिए कच्चा एसक्यूएल ऐसा कुछ है, जो एक सबक्वायरी में शामिल होता है जो प्रत्येक उत्पाद के लिए न्यूनतम मूल्य प्राप्त करता है, फिर उन उत्पादों को सूची फ़िल्टर करें जिनके मूल्य == न्यूनतम मूल्य।

SELECT * FROM product 
    LEFT JOIN (
    SELECT _products_suggestions.product_id, MIN(price) as min_price 
    FROM suggestion 
    RIGHT JOIN _products_suggestions 
    GROUP BY _products_suggestions.product_id 
    ) AS min_suggestions ON min_suggestions.product_id = product.id 
    WHERE product.price = min_suggestions.price 

आप (1.4) के रूप में एक कस्टम प्रदर्शन नहीं कर सकते इस तरह Django ORM का उपयोग करने में शामिल हो। आपको raw SQL query का उपयोग करने की आवश्यकता होगी।

  • Product.objects.filter(price__in = self.suggestions)

self.suggestions, यह मानते हुए हम कर रहे हैं एक Product उदाहरण विधि में, एक सूची नहीं है, अब तक यह एक RelatedSetManager है। मुझे संदेह है कि, आप उन सभी उत्पादों को प्राप्त करना चाहते हैं जिनमें वर्तमान (उर्फ self) उत्पाद की सुझाई गई कीमतों में से एक है। यह अजीब लगता है।

यह आपके जैसा लगता है जैसे उत्पादों की एक सूची है जो सुझाए गए मूल्यों के एक से मेल खाता है।

आपको फिर से कच्चे एसक्यूएल की आवश्यकता होगी। : -/

SELECT * FROM product 
    LEFT JOIN _products_suggestions ON _products_suggestions.product_id = product.id 
    LEFT JOIN suggestion ON _products_suggestions.suggestion_id = suggestion.id 
    WHERE suggestion.price = product.price 

ऐसा लगता है, ऐसा होगा। RIGHT JOIN वहां तेजी से हो सकता है, मुझे यकीन नहीं है, लेकिन फिर भी आप उन उत्पादों और सुझावों की एक सूची के साथ समाप्त हो जाएंगे जिनकी कीमत समान है।

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

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