2017-04-11 99 views
1

我試圖讓他們在Django上計算最多的10輛汽車。從Django數據庫獲取總計算

Calculations模型如下:

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) 

查詢,我用的是如下:

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] 

這個查詢給我:

<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), 
    ....... 
]> 

但事實並非如此。

當我在查詢中使用

values_list('make', 'model')

,而不是

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

然後我得到正確的結果:

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

正確的結果是:

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

但在這個結果我只得到make, model and number of calculations但我需要所有這些值:'make', 'model', 'first_registration', 'body', 'facelift', 'engine', 'drive','transmission', 'mileage',這就是爲什麼我試圖用:

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] 

我該怎麼辦錯了嗎?

+1

我不明白你的問題。第一個結果有什麼問題?如果第二個代碼給你正確的結果,你爲什麼不使用它? –

+0

@DanielRoseman因爲我需要所有這些價值觀,而不僅僅是「製造和模型」。第一個查詢的問題是它給出了錯誤的結果。 – Boky

+0

但是什麼是正確的結果? –

回答

0

你應該檢查你的查詢。您沒有正確引用「first_registration」字段的引號。使用這個:

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

這只是通過複製粘貼錯誤。 – Boky

+0

也許獨特()做出這樣的努力? –

0

問題是distinct()函數。所有字段('make','model','first_registration','body','facelift','engine','drive','transmission','''')的行將被選中。里程「)應該是不同的,當你使用查詢:

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] 

相同,但僅適用於域(」做」,‘模型’)當您使用查詢:

values_list('make', 'model') 

你只能通過在distinct(*fields)函數中,如果你使用PostgreSQL作爲DB,你的情況應該是:

distinct('make', 'model') 

否則我建議的是,您可以嘗試選擇所有與您想要的字段的行。之後,如果數據不大,您可以編寫python代碼來解析前10條記錄。