当前位置: 代码迷 >> python >> django queryset orm-从同一表中获取特定格式的数据
  详细解决方案

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

热度:100   发布时间:2023-06-13 16:50:08.0

我有我的模型.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)] 

我想输出这样的东西

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

我可以做到,但是有多个数据库调用。 我们可以用最少的查询集/数据库调用来达到相同的目的吗?

谢谢

查询很简单:

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

然后从那里去...