Skip to main content
 首页 » 编程设计

python之根据最新子记录的条件过滤 Django 中的模型

2024年08月30日31wuhuacong

我有两个这样的模型:

class Store(models.Model): 
    name = models.CharField(max_length=255) 
 
class Order(models.Model): 
    store = models.ForeignKey(Store) 
    date = models.DateTimeField(auto_now_add=True) 
    success = models.BooleanField() 

我想从 Store 模型中筛选出最新订单成功的所有记录,即 success == True。

虽然它看起来很简单,但我在确定如何使用 ORM 查询系统完成此操作时遇到了问题。

有什么帮助吗?谢谢。

请您参考如下方法:

我的方法是:做 2 个列表,第一个带有 (id_store, last_success_date) 元组,第二个带有 (id_store, last_date) 元组:

l_succ = stores.objects.filter(  
                       order__success = True  
                  ).annotate( 
                       last_success=Max('order__date') 
                  ).value_list ( 
                       'id', 'last_success' 
                  ) 
#l_succ = [ (1, '1/1/2011'), (2, '31/12/2010'), ... ] <-l_succ result 
 
l_last = stores.objects.annotate( 
                       last_date=Max('order__date') 
                  ).value_list ( 
                       'id', 'last_date' 
                  ) 
#l_last = [ (1, '1/1/2011'), (2, '3/1/2011'), ... ]   <-l_last result 

然后获取上次数据和上次成功日期相等的商店的商店 ID,并且您有查询:

store_success_ids =  [ k[0] for k in l_succ if k in l_last ] 
#store_success_ids = [1, 5, ... ]          <-store_success_ids result 
#Cast l_last to dictionary to do lookups if you have a lot of stores. 
 
result = Store.objects.filter( pk__in = store_success_ids)         

这似乎是一个优雅的解决方案,只有四行代码用于复杂的查询(但有一个简单的请求)。免责声明,未经测试。