【问题标题】:django queryset orm - from same table fetch data in particular formatdjango queryset orm - 从同一张表中获取特定格式的数据
【发布时间】:2017-02-13 10:31:10
【问题描述】:

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

我想输出这样的东西

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

我可以做到,但需要多个数据库调用。我们可以用最少的查询集/数据库调用来达到同样的效果吗?

谢谢

【问题讨论】:

    标签: python mysql django django-queryset


    【解决方案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]}
    

    然后从那里去......

    【讨论】:

    • 谢谢。那就是我要找的那个。 :)
    猜你喜欢
    • 2011-06-22
    • 2021-12-03
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多