我正试图在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]
我做错了什么?
答案 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条记录。