我有两个这样的模型:
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)
这似乎是一个优雅的解决方案,只有四行代码用于复杂的查询(但有一个简单的请求)。免责声明,未经测试。
