香草Django查询显示' flattened'用户/组(ManyToMany)列表

时间:2016-08-05 02:28:51

标签: python django

我试图编写一个简单的Django查询来显示vanilla django.contrib.auth模型中所有组中的所有用户:

User.username | Group.name
------------- | -----------
user1         | groupA
user1         | groupB
user2         | groupA
user2         | groupC
user3         | groupA

我想以某种方式使用as' plain'这里的Django魔术是可能的,因为我们的目标是使这个报告适合现有的报告框架,该报告框架不容易支持自定义查询等等。

所以我想做的事情就是:

from django.contrib.auth import UserGroup

for x in UserGroup.objects.all():
  print '%s\t%s' % (x.user.username, x.group.name)

...如果可以通过标准Django模型导入访问绑定用户和组对象的ManyToMany表。

2 个答案:

答案 0 :(得分:1)

这将为您提供所有组中所有用户的列表:

from django.contrib.auth.models import Group

for group in Group.objects.all():
    for user in group.user_set.all():
        print '%s\t%s' % (user.username, group.name)

您还可以通过以下方式在一个查询中获取相同的信息:

user_groups = Group.objects.values_list('user__username', 'name')

这将返回一个像这样的元组列表:

[
    ('user1', 'GroupA'),
    ('user1', 'GroupB'),
    ('user2', 'GroupC'),
    ...
]

答案 1 :(得分:0)

为了它的价值,我还发现:

from django.contrib.auth.models import User, Group

qs =  User.objects.raw("""select *, g.name as groupname
                          from auth_user_groups ug 
                          inner join auth_user u on ug.user_id = u.id
                          inner join auth_group g on ug.group_id = g.id""")
for x in qs:
  print '%s\t%s' % (x.username, x.groupname)

按预期工作,并返回一个充满工作的实际查询集'用户'对象引用。

它当然不能满足我原本的问题标准,即希望做到这一点"以某种方式使用as' plain'尽可能使用Django魔法"虽然如此,我已经接受了solarissmoke的回答。虽然我想在这里添加我的黑客作为后人的潜在答案。