簡體   English   中英

Django objects.filter 與列表和每個匹配的 5 個實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM