2011-11-28 72 views
0

我有一个django项目,其中有5个不同的模型。他们都有日期字段。假设我想从今天的日期获取所有模型中的所有条目。当然,我可以过滤每个模型,并将结果放在一个大列表中,但我相信这很糟糕。什么是有效的方式来做到这一点?通过多个模型查询

+0

有5个模型中所有日期字段的任何相关性接近这个?我的意思是为什么不制定它,以便你创建一个共同的日期字段? –

+0

@NagarajTantri模型之间没有依赖关系(每个模型都代表项目的不同部分)。但是,我会如何制作普通的日期字段呢?通过模型继承? – nukl

+0

关于组合查询集有点相关的问题:http://stackoverflow.com/questions/431628 – akaihola

回答

4

我不认为单独查询每个模型是一个坏主意 - 事实上,从数据库的角度来看,我看不出你会怎么做,否则,因为每个模型都需要一个单独的SQL查询。即使像@Nagaraj所说的那样,你为每一个其他模型引用建立了一个通用的Date模型,你仍然需要分别查询每个模型。你可能是正确的,但是,把成果转化为一个列表是不好的做法,除非你确实需要加载的每一个对象到内存中,为解释here

被警告,虽然,[评估查询集为一个列表]可能会有很大的内存开销,因为Django会将列表中的每个元素加载到内存中。相比之下,迭代QuerySet将利用数据库加载数据并仅在需要时才实例化对象。

很难在不了解您的用例的情况下提出其他选项。不过,我觉得我可能会通过使查询集的列表或字典,它然后我可以在我的视图中使用,例如:

querysets = [cls.objects.filter(date=now) for cls in [Model1, Model2, Model3]] 
2

看看使用多重继承(文档here)来定义的,你可以在你想查询返回的类继承一个类的日期字段。

例如:

class DateStuff(db.Model): 
    date = db.DateProperty() 

class MyClass1(DateStuff): 
    ... 

class MyClass2(DateStuff): 
    ... 

我相信Django将让你查询在DateStuff类,它会从MyClass1的和MyClass2返回对象。

感谢@nrabinowitz指出我以前的错误。

+1

我很困惑 - PolyModel是Appengine特有的,不是吗?它不是Django的一部分,我不认为OP可以在这里使用它。但是,关于继承的观点是一个很好的观点 - 相关的Django文档[可在此处获得](https://docs.djangoproject.com/en/1.3/topics/db/models/#multi-table-inheritance)。 – nrabinowitz

+0

啊,你是对的。我的错。 Django = App-Engine对我来说,所以我忽略了它。答案已被编辑。 – SteveShaffer