[英]Django objects.filter with list and 5 instances from each match
我有一個場景,我有一個屬性 model ,它具有評級屬性。 屬性 model 擁有數千個不同評級的屬性。 我需要根據以下標准從 db 中檢索屬性,
1)如果我有一個 rating_list = [5, 4, 1, 2, 3, unrated] 我知道我可以通過這樣做輕松實現它
Property.objects.filter(rating__in=rating_list)[:50]
問題是,由於我有數千個不同評級的屬性,因此上述查詢有可能返回只有 5 個評級的 50 個屬性,而過濾器中的每個評級需要 10 個屬性。
2)另一個要求是我希望返回的結果與 rating_list 中給出的順序完全相同。 例如,查詢集應該包含評級 5 的前 10 個屬性,以及評級 4 和下一個評級 1 的下一個 10 屬性,依此類推。
3) 由於我們有數千個屬性,我們希望在單個查詢中完成,而不是在多個查詢中。
是否有任何解決方案可以實現這一目標或可能的解決方案。
您可以對查詢集進行聯合,並限制該聯合,例如:
Property.objects.filter(rating=5)[:10].union(
Property.objects.filter(rating=4)[:10],
Property.objects.filter(rating=1)[:10],
Property.objects.filter(rating=2)[:10],
Property.objects.filter(rating=3)[:10],
Property.objects.filter(rating=)[:10],
all=True
)
通過使用union
,通常會遵守順序。
.union
在單個查詢中執行,SQL 將如下所示:
(SELECT * FROM appname_property WHERE rating=5 LIMIT 10)
UNION ALL (SELECT * FROM appname_property WHERE rating=4 LIMIT 10)
UNION ALL (SELECT * FROM appname_property WHERE rating=1 LIMIT 10)
UNION ALL (SELECT * FROM appname_property WHERE rating=2 LIMIT 10)
UNION ALL (SELECT * FROM appname_property WHERE rating=3 LIMIT 10)
UNION ALL (SELECT * FROM appname_property WHERE rating= LIMIT 10)
由於過濾可能很昂貴,您可能希望在rating
字段中添加db_index=True
[Django-doc] :
class Property(models.Model):
rating = models.IntegerField(db_index=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.