【问题标题】:Django QuerySet, Filtering Data Based on The Latest Entry of Each Data's Column/Field equals to a particular ValueDjango QuerySet,根据每个数据的列/字段的最新条目等于特定值过滤数据
【发布时间】:2018-09-07 02:26:28
【问题描述】:
#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)

Orders 模型有外键rentedvehicle 指代Vehicles 模型

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

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】:

    许多可能的解决方案。最佳取决于您的 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'])
    

    这里发生的情况是,我们正在确定最近的退货日期,然后过滤订单以仅包含最近的订单,然后根据最新订单的状态过滤车辆。

    【讨论】:

    • 我使用 django 2.1 谢谢,但它并没有真正起作用。当我使用该代码时,仍然会出现其他一些状态。我在您的代码中修复了变量: topCar = Vehicles.objects.filter(orders__pickupstore__state = request.POST['state']).annotate(max_date=Max('orders__returndate')).filter(orders__returndate=F('max_date') ).filter(orders__returnstore__state = request.POST['state'])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2013-02-15
    • 2012-04-22
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多