我的models.py就是这样的
CHOICES = (
(1,'Test1'),
(2,'Test2'),
(3,'Test3'),
(4,'Test4'),
(5,'Test5'),
)
class A(models.Model):
x = models.CharField('A', max_length=256)
def __unicode__(self):
return self.x
class B(models.Model):
emp = models.ForeignKey(User, verbose_name='emp')
y = models.ForeignKey(A, verbose_name='a')
z = models.IntegerField('testing', choices = CHOICES)
我在数据库中的这些表中有一些数据。
User.objects.values_list('username',flat = True)
[u'user1', u'user2', u'user3']
A.objects.values_list('x',flat = True)
[u'python', u'java', u'php', u'javascript']
B.objects.values_list('emp__username','y__x','z')
[(user1', u'python', 3L), (user2', u'php', 5L), (u'user1', u'javascript', 5L), (u'user3', u'python', 5L), (u'user3', u'java', 5L)]
我想输出类似这样的东西
employees = {
'user1':{
'Test5':"javascript",
'Test4': "",
'Test3':"python",
'Test2':"",
'Test1':""
},
'user2':{
'Test5':"php",
'Test4': "",
'Test3':"",
'Test2':"",
'Test1':""
},
'user3':{
'Test5':"python, java",
'Test4': "",
'Test3':"",
'Test2':"",
'Test1':""
},
}
我可以使用多个数据库调用。我们可以用最少的查询集/数据库调用来实现相同的目标吗?
由于
答案 0 :(得分:1)
查询很简单:
bs = B.objects.select_related('emp', 'y').order_by('emp__username', 'z')
这些B
个实例包含您需要的所有信息。首先,您可以这样做:
from itertools import groupby
user_dct = {k: list(g) for k, g in groupby(bs, lambda b: b.emp.username)}
user_dct
{'user1': [b1, b2], 'user2': [b3], 'user3': [b4, b5]}
从那里开始......