Django QuerySet,基于每个数据的列/字段的最新条目过滤数据等于特定值

问题描述 投票:0回答:1
#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)

订单模型有外键租用车辆,是指车辆型号

我已经根据皮卡存储状态过滤了数据,例如在特定状态下从商店中提取的车辆列表

Vehicles.objects.filter(orders__pickupstore__state = request.POST['state'])

我希望能够过滤上面的过滤数据,以便我可以获得在特定状态下从商店中获取的车辆列表,其中Orders模型中的最新条目具有returnstore__state ==特定状态

所以基本上,我想实现这个目标:

Vehicles.objects.filter(orders__pickupstore__state = request.POST['state']).filter(the latest entry returnstore state =request.POST['state'])
django django-models django-queryset django-orm
1个回答
1
投票

许多可能的解决方最佳取决于你的Django版本(1.11或更高?)。这是一个可能的解决方案:

from django.db.models import Max, F

Vehicles.objects.filter(orders__pickupstore__state = request.POST['state']).annotate(max_date=Max('orders__returndate')).filter(orders__return_date=F('max_date')).filter(orders__state = request.POST['state'])

这里发生的是我们确定最近的返回日期,然后过滤订单以仅包括最新的订单,然后在最新订单的状态下过滤车辆。

© www.soinside.com 2019 - 2024. All rights reserved.