django queryset orm - 从同一个表中获取特定格式的数据

时间:2017-02-13 10:31:11

标签: python mysql django django-queryset

我的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)

我在数据库中的这些表中有一些数据。

  1. User.objects.values_list('username',flat = True)

    [u'user1', u'user2', u'user3']
    
  2. A.objects.values_list('x',flat = True)

     [u'python', u'java', u'php', u'javascript']
    
  3. 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)]
    
  4. 我想输出类似这样的东西

    employees = {
        'user1':{
               'Test5':"javascript",
               'Test4': "",
               'Test3':"python",
               'Test2':"",
               'Test1':""
             },
        'user2':{
               'Test5':"php",
               'Test4': "",
               'Test3':"",
               'Test2':"",
               'Test1':""
              },
        'user3':{
               'Test5':"python, java",
               'Test4': "",
               'Test3':"",
               'Test2':"",
               'Test1':""
              },
      }
    

    我可以使用多个数据库调用。我们可以用最少的查询集/数据库调用来实现相同的目标吗?

    由于

1 个答案:

答案 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]}

从那里开始......