2012-01-23 30 views
1

我有一个简单的Python/Django的类:充分利用数据库的某些元素在Django

class myModel(models.Model): 
    date = models.DateTimeField() 
    value = models.IntegerField() 

,我想从我的数据库中的两个元素。首先是最新的元素,第二个是最新的积极因素。因此,我可以做到这一点是这样的:

myModel.objects.all().order_by('-date')[:1][0] 
myModel.objects.filter(value__gte = 0).order_by('-date')[:1][0] 

注意那些[:1][0]末 - 这是因为我希望得到最大限度的利用数据库的SQL引擎。事情是,我仍然需要两个查询,我想将它组合成一个单一的(如最后[:2]这将产生我想要的结果)。我知道Django的Q,但不知道如何在这种情况下使用它。也许一些原始的SQL?我在等待想法。 :)

+1

我不明白你为什么使用'[:1] [0]'而不是'[0]',有什么我失踪? – juliomalegria

+0

我知道'[:1]'在MySQL中被翻译成(例如)'limit 0,1'。但我认为'[0]'只能将查询转换为列表并取第0个元素。我想我错了。 – freakish

回答

2

这看起来像对我来说过早的优化。是两个查询,而不是一个非常糟糕的?目前,任何知道Django ORM的人都可以理解你的两个查询。在用一些时髦的原始SQL代替它之后,情况可能并非如此。您可以使用[0]而不是[:1][0]。 Django知道如何有效地分割查询集 - 两个查询都会导致完全相同的SQL。

+0

好吧,也许两个查询而不是一个是不是一个大问题。早些时候,我有类似的问题(即做一个查询,而不是很多),虽然它可以将1000个查询变为1,但它可以显着提高性能。但是也许你是对的,我会离开它。 – freakish

1

这并不完全回答你的问题,但你可以通过使用latest QuerySet method摆脱那些[:1][0]order_by的,它会在查询集使用如日期字段提供的参数返回最新的元素。