簡體   English   中英

在Django中將查詢鏈接在一起

[英]chaining queries together in Django

我有一個查詢,可從我的頭像應用程序獲取32個頭像圖像:

newUserAv = Avatar.objects.filter(valid=True)[:32]

我想將其與django的Auth用戶模型的查詢結合起來,這樣我就可以得到最后32位具有頭像圖像的人,並按加入的日期排序。

將這兩個鏈接在一起的最佳方法是什么?

頭像應用程序是可重用的應用程序,其模型為:

image = models.ImageField(upload_to="avatars/%Y/%b/%d", storage=storage)
user = models.ForeignKey(User)
date = models.DateTimeField(auto_now_add=True)
valid = models.BooleanField()

請注意,日期字段是頭像的更新日期,因此不適合我的目的

您可以在自己的User類中放置一個字段(您可能必須將User子類化或由django.contrib.auth.models.User組成),以表明該用戶具有化身。 比您可以輕松地進行查詢。

或做類似的事情:

from django.utils.itercompat import groupby
avatars = Avatar.objects.select_related("user").filter(valid=True).order_by("-user__date_joined")[:32]
grouped_users = groupby(avatars, lambda x: x.user)
user_list = []
for user, avatar_list in grouped_users:
    user.avatar = list(avatar_list)[0]
    user_list.append(user)
# user_list is now what you asked for in the first_place: 
# a list of users with their avatars

假設一個用戶只有一個頭像。 您的模型允許每個用戶使用多個虛擬形象,因此您必須注意不要存儲多個虛擬形象。

代碼段的解釋:最近32位最近加入的用戶的化身與相關用戶一起被請求,因此在即將到來的代碼中不必對其中任何一個進行數據庫查詢。 然后將化身列表與用戶作為關鍵字分組。 list從生成器avatar_list獲取所有項目,並且第一個項目(應該只有一個)分配給user.avatar

請注意,這不是必需的,您可以始終執行以下操作:

for avatar in avatars:
    user = avatar.user

但是通過user.avatar訪問化身可能會更自然。

不可能在兩個不同的基本模型上組合查詢。 Django不允許您執行此操作(它會引發錯誤,告訴您確切的信息)。

但是,如果您具有從一個模型到另一個模型的外鍵,則將select_related()添加到查詢中將在單個數據庫查詢中將相關對象提取到內存中,以便您無需訪問數據庫就可以訪問它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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