反向外键查找
Reverse Foreign Key Lookup
#models.py
class Orders(models.Model):
orderid = models.IntegerField(db_column='orderID', primary_key=True)
createdate = models.DateField(db_column='createDate', blank=True, null=True)
pickupdate = models.DateField(db_column='pickupDate', blank=True, null=True)
returndate = models.DateField(db_column='returnDate', blank=True, null=True)
pickupstore = models.ForeignKey(Branch, models.DO_NOTHING, db_column='pickupStore', blank=True, null=True,related_name = 'pickupstore')
returnstore = models.ForeignKey(Branch, models.DO_NOTHING, db_column='returnStore', blank=True, null=True,related_name = 'returnstore')
rentedvehicle = models.ForeignKey('Vehicles', models.DO_NOTHING, db_column='rentedVehicle', blank=True, null=True)
customer = models.ForeignKey(Customer, models.DO_NOTHING, db_column='customer', blank=True, null=True)
class Vehicles(models.Model):
vehicleid = models.IntegerField(db_column='vehicleID', primary_key=True)
make = models.CharField(max_length=45, blank=True, null=True)
model = models.CharField(max_length=45, blank=True, null=True)
series = models.CharField(max_length=45, blank=True, null=True)
#views.py
def topcar(request):
topCar = Vehicles.objects.filter(orders__pickupstore__state = request.POST['state']).annotate(num_car =Count('orders')).order_by('-num_car')[:20]
return render(request, 'web/topcar.html',{'topCar':topCar, 'state':request.POST['state'])
#topcar.html
{% for car in topCar %}
<tr>
<td>{{car.make}} {{car.model}} {{car.series}} {{car.year}}</td>
<td>{{car.seatcapacity}}</td>
<td>{{the latest car return store}}</td>
</tr>
{% endfor %}
在views.py中,topCar变量是Orders中订单最高的前20辆车(在Vehicles模型中)的列表model.TheOrders模型中的字段rentedvehicle是外键,指的是Vehicles模型。
我想为 topCar 变量中的每辆汽车获取最新的 returnstore(订单模型中的一个字段)。我希望它显示在 topCar.html
的{{the latest car return store}}
我应该怎么做?
我发现我可以做到这一点:
Orders.objects.filter(rentedvehicle = car.vehicleid).latest('returndate').returnstore
获取车辆 ID 的最新 return商店。但是,我不知道如何使用它来获得我想要的结果。
您只能在 Django 模板中使用简单的查找逻辑,因此您无法在那里进行 latest('returndate')
过滤。
相反,您可以向 Vehicle
模型添加一个方法来获取最新订单:
class Vehicles(models.Model):
vehicleid = models.IntegerField(db_column='vehicleID', primary_key=True)
make = models.CharField(max_length=45, blank=True, null=True)
model = models.CharField(max_length=45, blank=True, null=True)
series = models.CharField(max_length=45, blank=True, null=True)
def latest_order(self):
return self.orders_set.latest('returndate')
那么您应该可以将模板修改为:
{% for car in topCar %}
<tr>
<td>{{car.make}} {{car.model}} {{car.series}} {{car.year}}</td>
<td>{{car.seatcapacity}}</td>
<td>{{car.latest_order.returnstore}}</td>
</tr>
{% endfor %}
#models.py
class Orders(models.Model):
orderid = models.IntegerField(db_column='orderID', primary_key=True)
createdate = models.DateField(db_column='createDate', blank=True, null=True)
pickupdate = models.DateField(db_column='pickupDate', blank=True, null=True)
returndate = models.DateField(db_column='returnDate', blank=True, null=True)
pickupstore = models.ForeignKey(Branch, models.DO_NOTHING, db_column='pickupStore', blank=True, null=True,related_name = 'pickupstore')
returnstore = models.ForeignKey(Branch, models.DO_NOTHING, db_column='returnStore', blank=True, null=True,related_name = 'returnstore')
rentedvehicle = models.ForeignKey('Vehicles', models.DO_NOTHING, db_column='rentedVehicle', blank=True, null=True)
customer = models.ForeignKey(Customer, models.DO_NOTHING, db_column='customer', blank=True, null=True)
class Vehicles(models.Model):
vehicleid = models.IntegerField(db_column='vehicleID', primary_key=True)
make = models.CharField(max_length=45, blank=True, null=True)
model = models.CharField(max_length=45, blank=True, null=True)
series = models.CharField(max_length=45, blank=True, null=True)
#views.py
def topcar(request):
topCar = Vehicles.objects.filter(orders__pickupstore__state = request.POST['state']).annotate(num_car =Count('orders')).order_by('-num_car')[:20]
return render(request, 'web/topcar.html',{'topCar':topCar, 'state':request.POST['state'])
#topcar.html
{% for car in topCar %}
<tr>
<td>{{car.make}} {{car.model}} {{car.series}} {{car.year}}</td>
<td>{{car.seatcapacity}}</td>
<td>{{the latest car return store}}</td>
</tr>
{% endfor %}
在views.py中,topCar变量是Orders中订单最高的前20辆车(在Vehicles模型中)的列表model.TheOrders模型中的字段rentedvehicle是外键,指的是Vehicles模型。
我想为 topCar 变量中的每辆汽车获取最新的 returnstore(订单模型中的一个字段)。我希望它显示在 topCar.html
的{{the latest car return store}}我应该怎么做?
我发现我可以做到这一点:
Orders.objects.filter(rentedvehicle = car.vehicleid).latest('returndate').returnstore
获取车辆 ID 的最新 return商店。但是,我不知道如何使用它来获得我想要的结果。
您只能在 Django 模板中使用简单的查找逻辑,因此您无法在那里进行 latest('returndate')
过滤。
相反,您可以向 Vehicle
模型添加一个方法来获取最新订单:
class Vehicles(models.Model):
vehicleid = models.IntegerField(db_column='vehicleID', primary_key=True)
make = models.CharField(max_length=45, blank=True, null=True)
model = models.CharField(max_length=45, blank=True, null=True)
series = models.CharField(max_length=45, blank=True, null=True)
def latest_order(self):
return self.orders_set.latest('returndate')
那么您应该可以将模板修改为:
{% for car in topCar %}
<tr>
<td>{{car.make}} {{car.model}} {{car.series}} {{car.year}}</td>
<td>{{car.seatcapacity}}</td>
<td>{{car.latest_order.returnstore}}</td>
</tr>
{% endfor %}