在Django中一起链接查询

时间:2009-10-27 00:48:13

标签: python django django-models

我有一个查询,可以从我的头像应用程序中获取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()

请注意,日期字段是化身更新的日期,因此不适合我的purporse

2 个答案:

答案 0 :(得分:2)

您可以在自己的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访问头像可能会更自然。

答案 1 :(得分:0)

无法在两个不同的基本模型上组合查询。 Django不会让你这样做(它会抛出一个错误告诉你的确如此)。

但是,如果从一个模型到另一个模型有一个外键,那么在查询中添加select_related()将在单个数据库查询中将相关对象提取到内存中,这样您就可以访问它们而无需返回到数据库。