2009-10-27 76 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