2009-10-27 72 views
0

在一起,我有一個查詢,讓我32張頭像圖片來自我的頭像應用:鏈接查詢在Django

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

我想這與查詢相結合,Django的驗證用戶模型,這樣我就可以得到最後的最後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() 

注意日期字段,是動漫形象被更新的日期,所以不適合我purporse

+0

頭像模型與用戶模型有什麼關係? – 2009-10-27 00:50:45

+0

它用戶的用戶模型作爲主鍵(我很抱歉,如果我的語法不正確,我在這裏學習) – 2009-10-27 01:04:05

+0

你能用你的'阿凡達'模型代碼更新你的原始文章嗎? – thornomad 2009-10-27 01:16:43

回答

2

您可以將字段放在您自己的用戶類(您可能必須繼承用戶類或用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訪問頭像可能會感覺更自然。

+0

Stefanw - 這看起來非常好,我會嘗試一下,有沒有機會給你的代碼添加一些評論,這樣我可以更好地理解它在做什麼? – 2009-10-27 02:36:09

+0

這工作完美(只是測試它),但我很想更好地瞭解代碼 – 2009-10-27 02:48:27

+0

我已經添加了一些解釋。 – stefanw 2009-10-27 10:26:41

0

這不是可能在兩個不同的基礎模型上結合查詢。 Django不會讓你這樣做(它會拋出一個錯誤告訴你這個)。但是,如果您有一個外鍵從一個模型到另一個模型,那麼將select_related()添加到您的查詢將在單個數據庫查詢中將相關對象提取到內存中,以便您可以訪問它們而不必返回到數據庫。

+0

嗨Gabriel, 我不知道我完全理解,所以如何我例如查詢我的用戶模型(我會查詢所有用戶/好像我限制到最後32有些可能沒有頭像對象) - 然後將其傳遞 - 在加入日期之前對所有用戶執行查詢似乎有點低效? – 2009-10-27 01:03:23