Обратный поиск внешнего ключа - PullRequest
0 голосов
/ 06 сентября 2018
#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 представляет собой список из 20 лучших транспортных средств (в модели транспортных средств), которые имеют высокие заказы в модели заказов. Поле арендованного автомобиля в модели заказов - это внешний ключ, относящийся к модели транспортных средств.

Я хочу получить последний магазин возврата (поле в модели Orders) для каждого автомобиля в переменной topCar. Я хочу, чтобы он отображался в {{последнем магазине возврата автомобилей}} в topCar.html

Как мне это сделать?

Я обнаружил, что могу сделать это:

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

, чтобы получить последний магазин возврата для идентификатора автомобиля. Однако я не знаю, как использовать это для получения желаемого результата.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать только простую логику поиска в шаблонах 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 %}
...