У меня есть три класса:
class Vehicle(models.Model):
stock_number = models.CharField(max_length=6)
vin = models.CharField(max_length=17)
year = models.ForeignKey(Year)
... (several other fields declared here)
class VehicleMileage(models.Model):
vehicle = models.ForeignKey(Vehicle)
odometer_reading = models.PositiveIntegerField()
date_time_added = models.DateTimeField(default=datetime.today, editable=False)
class VehicleMileage(models.Model):
vehicle = models.ForeignKey(Vehicle)
price = models.PositiveIntegerField()
date_time_added = models.DateTimeField(default=datetime.today, editable=False)
Что я хочу сделать, так это получить все транспортные средства с их последним пробегом и ценой от соответствующих классов, и все это в одном запросе. В настоящее время я получаю все три отдельно, а затем вставляю то, что я хочу, в элемент словаря для использования в шаблонах, например:
vehicle_list = Vehicle.objects.all().values('vin', 'stock_number', 'year__year')
vehicles = []
for vehicle in vehicle_list:
lst = {}
latest_mileage = VehicleMileage.objects.filter(vehicle__stock_number =
stock_number).values('odometer_reading').order_by(
'-date_time_added')[0]
latest_price = VehiclePrice.objects.filter(vehicle__stock_number =
stock_number).values('price').order_by(
'-date_time_added')[0]
lst['stock_number'] = vehicle['stock_number']
lst['year'] = vehicle['year__year']
lst['vin'] = vehicle['vin']
lst['mileage'] = latest_mileage['odometer_reading']
lst['price'] = latest_price['price']
vehicles.append(lst)
Есть ли лучший способ получить то, что я хочу, и выполнить наименьшее количество запросов? В настоящее время приведенный выше код требует около 100 запросов.