2012-04-04 12 views
0

Ich habe eine Anwendung, wo Benutzer ihre eigenen Anzeige Spalten auswählen. Jede Anzeigespalte hat eine bestimmte Formel. Um diese Formel zu berechnen, muss ich einige verwandte Spalten (Eins-zu-Eins-Beziehung) verbinden und den Wert berechnen."SELECT ... AS ..." mit verwandten Modelldaten in Django

Die Modelle sind wie (dies ist nur ein Beispiel-Modell, tatsächlich hat mehr als 100 Felder):

class CompanyCode(models.Model): 
    """Various Company Codes""" 

    nse_code = models.CharField(max_length=20) 
    bse_code = models.CharField(max_length=20) 
    isin_code = models.CharField(max_length=20)  

class Quarter(models.Model): 
    """Company Quarterly Result Figures""" 

    company_code = models.OneToOneField(CompanyCode) 
    sales_now = models.IntegerField() 
    sales_previous = models.IntegerField() 

Ich habe versucht zu tun:

ratios = {'growth':'quarter__sales_now/quarter__sales_previous'} 
CompanyCode.objects.extra(select=ratios) 
# raises "Unknown column 'quarter__sales_now' in 'field list'" 

Ich habe auch versucht rohe Abfrage:

query = ','.join(['round((%s),2) AS %s' % (formula, ratio_name) 
    for ratio_name, formula in ratios.iteritems()]) 
companies = CompanyCode.objects.raw(""" 
    SELECT `backend_companycode`.`id`, %s 
    FROM `backend_companycode` 
    INNER JOIN `backend_quarter` ON ( `backend_companycode`.`id` = `backend_companyquarter`.`company_code_id`) 
    """, [query]) 
#This just gives empty result 

Bitte geben Sie mir einen kleinen Hinweis, wie ich verwandte Spalten verwenden kann, vorzugsweise mit 'extra' Befehl. Vielen Dank.

Antwort

0

Ok, ich habe es herausgefunden haben. In der obigen Verwendung:

CompanyCode.objects.select_related('quarter').extra(select=ratios) 

löste das Problem.

Um auf verwandte Modelldaten über 'extra' zugreifen zu können, müssen wir lediglich sicherstellen, dass dieses Modell in unserer Abfrage verknüpft ist. Mit select_related verbindet die Abfrage automatisch die genannten Modelle.

Danke :).

1

Da die Berechnung an einer einzelnen Quarter Instanz durchgeführt wird, wo ist die Notwendigkeit, es in der SELECT zu tun? Sie könnten nur eine ratio Methode/Eigenschaft auf dem Quarter Modell definieren:

@property 
def quarter(self): 
    return self.sales_now/self.sales_previous 

und es nennen, wo notwendig

+0

Sorry, aber die oben ist nur ein Beispiel. Es gibt mehr als 100 verschiedene Verhältnisse und 100 verschiedene Felder. – Pratyush

1

Inzwischen sagt die Django-Dokumentation, dass man use extra as a last resort.

Also hier ist eine Abfrage, ohne extra():

from django.db.models import F 

CompanyCode.objects.annotate(
    growth=F('quarter__sales_now')/F('quarter__sales_previous'), 
) 
+0

Beachten Sie, dass dies möglicherweise nicht mit Django 1.7 funktioniert. Für weitere Informationen: https://code.djangoproject.com/ticket/14030 – yunshi

Verwandte Themen