2017-04-11 3 views
1

Ich versuche, die 10 Autos mit den meisten Berechnungen auf ihnen in Django zu bekommen.Gesamtberechnungen von der Django-Datenbank erhalten

Calculations Modell ist wie folgt:

class Calculations(models.Model): 
    user = models.ForeignKey(to=User) 
    category = models.CharField(max_length=127) 
    make = models.CharField(max_length=127) 
    model = models.CharField(max_length=127) 
    first_registration = models.CharField(max_length=127) 
    body = models.CharField(max_length=127) 
    facelift = models.CharField(max_length=127) 
    engine = models.CharField(max_length=127) 
    drive = models.CharField(max_length=127) 
    transmission = models.CharField(max_length=127) 
    trim = models.CharField(max_length=127, null=True, blank=True) 
    mileage = models.IntegerField() 
    vat_inclusive = models.NullBooleanField(null=True) 
    price_date = models.DateTimeField(auto_now_add=True) 
    market_days_identical = models.CharField(max_length=6, null=True) 
    market_days_similar = models.CharField(max_length=6, null=True) 
    sales_price = models.DecimalField(max_digits=8, decimal_places=2, null=True) 
    sales_price_currency = models.CharField(max_length=10, null=True) 
    purchase_price = models.DecimalField(max_digits=8, decimal_places=2, null=True) 
    purchase_price_currency = models.CharField(max_length=10, null=True) 
    adjusted_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True) 
    customer = models.ForeignKey(to=Customer, null=True, blank=True, on_delete=models.SET_NULL) 
    data = models.TextField(null=True, blank=True) 

Abfrage, die ich wie folgt:

calculations_list = Calculations.objects.values_list('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage') 
           .distinct() 
           .annotate(num_calculations=Count('make')) 
           .order_by('-num_calculations')[:10] 

Diese Abfrage gibt mir:

<QuerySet [ 
    ('BMW', 'M3', '1/2017', 'SALOON/4 doors', '2014', 'M3', 'RWD', 'MANUAL ', 70000, 6), 
    ('Audi', 'A4', '1/2017', ' SALOON/4 doors', '2012', '2.0 TDI', 'FWD', 'MANUAL ', 70000, 4), 
    ('BMW', '7 series', '1/2017', ' SALOON/4 doors', '2008', '730 d', 'xDrive FOURWD', 'AUTOMATIC Steptronic', 70000, 4), 
    ....... 
]> 

Aber das ist nicht wahr, .

Wenn ich in der Abfrage verwenden

values_list('make', 'model')

statt

values_list('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage')

dann bekomme ich das richtige Ergebnis:

<QuerySet [ 
    ('Audi', 'A3', 7), 
    ('Audi', 'A4', 6), 
    ('BMW', 'M3', 6), 
    .... 
]> 

Das richtige Ergebnis ist:

<QuerySet [ 
     ('Audi', 'A3', 7), 
     ('Audi', 'A4', 6), 
     ('BMW', 'M3', 6), 
     .... 
    ]> 

Aber in diesem Ergebnis komme ich nur make, model and number of calculations aber ich brauche all diese Werte: 'make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage' und deshalb habe ich zu verwenden versucht:

calculations_list = Calculations.objects.values_list('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage') 
            .distinct() 
            .annotate(num_calculations=Count('make')) 
            .order_by('-num_calculations')[:10] 

Was kann ich tun, falsch?

+1

Ich verstehe Ihre Frage nicht. Was stimmt nicht mit dem ersten Ergebnis? Und wenn der zweite Code Ihnen das richtige Ergebnis gibt, warum verwenden Sie das nicht? –

+0

@DanielRoseman Weil ich all diese Werte brauche, nicht nur 'make and model'. Und das Problem mit der ersten Abfrage ist, dass es das falsche Ergebnis liefert. – Boky

+0

Aber was ist das richtige Ergebnis ?. –

Antwort

0

Sie sollten Ihre Abfrage überprüfen. Sie haben das Feld "first_registration" nicht korrekt in Anführungszeichen eingeschlossen. Verwenden Sie dies:

values_list('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage') 
+0

Das war nur Tippfehler durch Kopieren und Einfügen. – Boky

+0

Vielleicht macht die distinct() solche Anstrengung? –

0

Das Problem ist die distinct() -Funktion.

Die distinct() - Funktion wählt die Zeilen aus, die alle Felder ('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive', 'transmission', ' Meilen ‚) sollte anders sein, wenn Sie die Abfrage verwenden:

calculations_list = Calculations.objects.values_list('make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage') 
          .distinct() 
          .annotate(num_calculations=Count('make')) 
          .order_by('-num_calculations')[:10] 

Same aber nur für Felder (‘ make‘,‚Modell‘), wenn Sie die Abfrage verwenden:

values_list('make', 'model') 

Sie nUR passieren kann Felder in der distinct(*fields)-Funktion, wenn Sie PostgreSQL als DB verwenden, sollte Ihr Fall sein:

distinct('make', 'model') 

Sonst was ich vorschlage ist, dass Sie versuchen können, alle Zeilen mit den gewünschten Feldern auszuwählen. Danach können Sie Python-Code schreiben, um die oberen 10 Datensätze zu analysieren, wenn die Daten nicht groß sind.

Verwandte Themen