Получить последние записи из двух других таблиц на запись - PullRequest
1 голос
/ 29 августа 2011

У меня есть три класса:

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 запросов.

1 Ответ

2 голосов
/ 30 августа 2011

Существует нечто, называемое обратная связь в django orm. Вы можете использовать строчное имя модели в этом случае vehiclemileage и vehicleprice с моделью Vehicle, чтобы получить набор результатов.

Вот так выглядит запрос:

vehicles_with_latest_mileage_price = Vehicle.objects.values('vehiclemileage__odometer_reading','vehicleprice__price','vin','stock_number','year__year').order_by('-vehiclemileage__date_time_added','-vehicleprice__date_time_added')

Это должно вернуть последние автомобили с соответствующей ценой и пробегом, в результате один запрос и один набор данных.

извините, но вам придется прокрутить, чтобы увидеть весь запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...