【问题标题】:Reverse Foreign Key Lookup反向外键查找
【发布时间】:2019-02-11 20:28:51
【问题描述】:
#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模型中)的列表。Orders模型中的rentedvehicle字段是外键引用Vehicles模型。

我想在 topCar 变量中为每辆车获取最新的退货商店(订单模型中的一个字段)。我希望它显示在 topCar.html 中的 {{the latest car return store}}

我该怎么做?

我发现我可以做到这一点:

Orders.objects.filter(rentedvehicle = car.vehicleid).latest('returndate').returnstore

获取车辆 ID 的最新退货商店。但是,我不知道如何使用它来获得我想要的结果。

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    您只能在 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 %}
    

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2019-12-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多