Python 基于最新子记录的条件筛选Django中的模型

Python 基于最新子记录的条件筛选Django中的模型,python,django,django-queryset,Python,Django,Django Queryset,我有两个这样的模型: 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.objects.e

我有两个这样的模型:

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.objects.extra(where=['id in (select store_id from order where success = true)']) 
# first annotate latest order to Store which returns new queryset, filter new qs
# by success = True
stores = Store.objects.annotate(Max('order__date')).filter(order__success=True)
我想从最近订单成功的
商店
模型中筛选所有记录,即
success==True

虽然它看起来很简单,但我在计算如何使用ORM查询系统来实现这一点时遇到了一些问题


有什么帮助吗?谢谢。

您可以在一个查询中完成

使用QuerySets的功能编写如下所示的SQL:

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.objects.extra(where=['id in (select store_id from order where success = true)']) 
# first annotate latest order to Store which returns new queryset, filter new qs
# by success = True
stores = Store.objects.annotate(Max('order__date')).filter(order__success=True)

这种方法对你有用吗?环顾所有的商店,抓住每个商店的最新成功案例(如果有的话)

我最初的想法不正确:

latest_successes = []
store_objects = Store.objects.all()
for store_obj in store_objects:
    try:
        latest_success = Order.objects.filter(store=store_obj).filter(success=True).order_by('-date')[0]
    except IndexError:
        pass
    else:
        latest_successes.append(latest_success)
基于@demalexx的实体注释进行编辑

latest_successes = []
store_objects = Store.objects.all()
for store_obj in store_objects:
    try:
        is_latest_success = store_obj.order_set.order_by('-date')[0].success
    except IndexError:
        pass
    else:
        latest_successes.append(store_obj)

这只是一个想法,所以如果我完全错了,不要打我:) 我想你可以这样做:

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.objects.extra(where=['id in (select store_id from order where success = true)']) 
# first annotate latest order to Store which returns new queryset, filter new qs
# by success = True
stores = Store.objects.annotate(Max('order__date')).filter(order__success=True)

老实说,这是未经测试的。

我的方法是:列出两个列表,第一个带有(id\u store,last\u success\u date)元组,第二个带有(id\u store,last\u date)元组:

l_such=stores.objects.filter(
订单成功=真
).注释(
last_success=Max('订单日期')
).价值清单(
“id”,“最后一次成功”
)

#l_succ=[(1,'1/1/2011'),(2,'31/12/2010'),…]或者您需要一个查询吗?是否有一个解决方案可供您进行2次查询:获取每个sotore的上一个orderdate,并检查是否存在此数据和存储的
success
订单是一个解决方案?循环对您来说是有效的解决方案?这不会检查成功订单是否是最新的-此查询将返回至少有一个成功订单的存储。这里也不需要额外的功能:
Store.objects.filter(order\uu success=True)
也会这样做(或者类似的功能,还没有测试过)。如果商店模型中没有包含订单,您可以执行order\uu-success=True吗?关于最近的一点,你是对的。您可以通过适当修改查询中的extra()来检查最新订单是否成功。M,是的,我可以,这两个模型是连接的:。或者我不明白什么,在这里不适用?如何修改
额外的
,您的解决方案是什么?我也很想知道答案:)这行不通:你选择最新的成功顺序,但可能会有最近的失败顺序。需要修改它:
是最新的\u成功=store\u obj.order\u set.order\u by('-date')[0]。成功
。这是非常无效的:为每个存储对象创建新查询。但这取决于OP任务,它在某些情况下可以很好地工作。这是一个很好的观点,说明最近的订单有可能失败。我没想到。我不同意基于“每个存储对象的新查询”提出的方法是无效的,但我同意它可能不是最有效的方法(或者至少我希望有人发布更有效的方法)。我所说的无效,假设你有一百万个存储-你将得到一百万个SQL请求,这不是解决问题的最有效的方法:)而且OP没有告诉任何关于时间限制的事情,如果他需要实时的时间限制,比如在视图中准备这个列表,这是不合适的解决方案。@demalexx我肯定支持你。我只是对低效与低效的比较有些迂腐。但如果运行时接近宇宙的年龄=),则无效将是绝对正确的。顺便说一句,你现在觉得我的修订版正确吗?@demalexx顺便问一下,你能给我指一下解释你使用order_set的文档吗。我假设基于外键关系,我们可以访问每个存储的订单集,但我想确保我正确理解语法。这看起来很有希望。这里有一个关于这个概念的文档链接:嗨,DaniHP,这为我解决了这个问题。我使用了类似的解决方案。看起来不可能只进行一次查询。真倒霉(有时候ORM真的让我觉得自己很笨。)