2014-01-30 149 views
0

首先,祝中國新年快樂。Django根據相關對象對查詢集進行排序

我這個問題,我正在尋找排序查詢集的好方法:

的三個實體:Service, Order, Rating

A Service對象可以有多個Order對象,一個Order對象只能有一個Rating對象。 現在,我想根據它的平均Rating排名a Service

最直接的答案是: 第一次查詢的Service所有Orders並計算其平均Rating,然後根據平均評分排序Service

但是,我很擔心效率和響應。

所以,我想在Service對象中應該有一個屬性:Average_Rating。每次創建評論時,Average_Rating都會更新。

此方法是提高響應速度的好方法嗎?如果是這樣,那麼實施它的最好方法是什麼?謝謝。

+0

這是更好地看到比解釋的代碼,請張貼代碼爲您楷模。 –

+0

雖然沒有代碼可以查看,但基本上我明白你在說什麼。事實上,我認爲「直截了當」的解決方案並不是那麼糟糕。重點是每次想要對服務進行排名時都會發生額外的計算。對於第二種解決方案,即添加新屬性,每次創建評論時都會進行額外的計算。此外,平均評級計算並不昂貴,因爲您可以在一分貝命中和o(n)時間內完成評分。 –

回答

1

如果你不想反規範化,你可以使用annotation

假設你的模型是這樣的:

class Service(models.Model): 
    name = models.CharField(max_length=5) 

class Order(models.Model): 
    name = models.CharField(max_length=5) 
    service = models.ForeignKey(Service) 

class Rating(models.Model): 
    order = models.OneToOneField('Order') 
    grade = models.IntegerField() 

然後你就可以用平均標註和查詢:

Service.objects.annotate(avg_rate=Avg('order__rating__grade')).order_by('avg_rate') 
+0

嗨,伊蘭。謝謝!它似乎工作。還有一個問題,如果評級與訂單之間的關係是一對多關係(一個訂單有很多評論),那麼如何應用這種方法呢? –

+0

Afaik。完全一樣 – eran

+0

謝謝!到目前爲止,這是我見過的最簡單的解決方案。 –

相關問題