我有一个查询,可以从我的头像应用程序中获取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
答案 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()将在单个数据库查询中将相关对象提取到内存中,这样您就可以访问它们而无需返回到数据库。