2013-07-16 17 views
1

我有2個模型,即A和B.兩個都有一個共同的領域,比如時間戳。2個Django模型的ORDERBY查詢集體

X = A.objects.all() 

Y = A.objects.all() 

results = chain(X,Y)  # Union 

現在我想對results應用ORDERBY查詢。我怎樣才能做到這一點?

回答

2

雖然做的蟒蛇方式,它是利用某種排序的,這通常不是在Django做它的正確途徑。

原因是,要加入兩個不同模型的兩個queries,您必須將它們轉換爲列表(如其他答案所示)。

雖然這看起來不錯,但大部分時間都不是這樣,因爲你碰到了數據庫,即要求數據庫提供兩個模型的所有元素來創建這兩個列表,以及它們的連接。

爲什麼要在單個列表中加入兩個模型的最可能原因是兩者都應來自通用模型,例如,一個抽象模型。做這兩個模型有一個自然的共同領域,通過抽象模型的子類獲得。

然後可以使用order_by進行這樣的查詢的排序。這是更高效的,因爲queries are lazy


編輯:

例子:

class Parent(models.Model): 
    date_field = models.DateField() 

    def pretty_show(): 
     # returns general behavior 

class B(Parent): 
    # other specific fields 
    def pretty_show(): 
     # returns specific behavior 

class C(Parent): 
    # other specific fields 
    def pretty_show(): 
     # returns specific behavior 

X = Parent.objects.all().order_by("date_field") 

for x in X: 
    x.pretty_show() 

請注意,在這種情況下,父類不是抽象和孩子的不代理,但這樣的選擇在很大程度上取決於你想要達到的目標。希望這可以幫助。

+0

點的情況下:)! – Jingo

+0

我無法得到你。 在這種情況下如何設計查詢? – PythonEnthusiast

+0

這就是我寫的拋出錯誤。 \t'results.order_by =「date_time」)。'兩者都有共同的字段date_time – PythonEnthusiast

0

您可以嘗試創建模型對象的列表,然後排序是這樣的時間戳(兩種型號必須相同TIME-STAMP屬性):

l= list(x)+list(y) 
l.sort(key=lambda l: l.time_stamp) 

希望這是你在找什麼。

2

你的意思是:

X = A.objects.all() 

Y = B.objects.all() 

results = chain(X,Y)  # Union 

你可以施放結果列表()。列表中有順序的功能:

ut.sort(key=lambda x: x.count, reverse=True) 

more