从Django数据库获取总计算

时间:2017-04-11 07:43:31

标签: python django

我正试图在Django上获得计算最多的10辆车。

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]

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您应该检查您的查询。你没有包括&#34; first_registration&#34;引号中的字段正确。使用此:

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

答案 1 :(得分:0)

问题是distinct()函数。

distinct()函数将选择所有字段的行('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]

使用查询时,相同但仅适用于字段('make','model'):

values_list('make', 'model')

如果你使用PostgreSQL作为DB,你只能传递distinct(*fields)函数中的字段,你的情况应该是:

distinct('make', 'model')

否则我的建议是,您可以尝试选择包含所需字段的所有行。之后,如果数据不大,你可以编写python代码来解析前10条记录。