2011-08-29 15 views
1

、レコードごとに2つの他のテーブルから最新のエントリを取得:私はこれらの3つのクラスが持つ

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) 

私は何をしたいことはすべて、これは一つにはそれぞれのクラスからの彼らの最新の走行距離と価格ですべての車両を取得しており、クエリ。現在、私は、このように、テンプレートの使用のために辞書項目の中に、私が欲しいものを挿入し、別に3つのすべてを取得しています:

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のクエリが必要です。

+0

私はSQLを使ってそれを行う方法を理解しました。誰かがDjango ORMでそれを行う方法を知らない限り、私はこの解決策に固執すると思います。 –

答えて

2

reverse relationshipと呼ばれるものがdjango ormにあります。この場合のモデルの小文字の名前vehiclemileagevehiclepriceVehicleモデルを使用して、結果セットを得ることができます。

これは、クエリがどのように見えるかです:

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') 

これは、その関連する価格と走行距離1つのクエリをもたらし、1つのデータセットを返すと、最新の車を返す必要があります。

申し訳ありませんが、クエリ全体を表示するにはスクロールする必要があります。

+0

Excellent!私はすでにSQLオプションを実装していましたが、これは良いことです! ORMの機能が必要な場所がいくつかあります。 NPはスクロールして:) –

関連する問題