从Django查询集创建字典字典

时间:2015-09-03 01:15:11

标签: python django dictionary django-queryset

我目前正在创建一个像这样的查询集字典:

def get_type_dicts(self):
    types = BadgeType.objects.all()
    return {t.name : self.get_queryset().get_type(t) for t in types}

编辑:此方法是BadgeManager(models.Manager)的一部分,其中:

class Badge(models.Model):
    ...
    badge_type = models.ForeignKey(BadgeType)

导致类似这样的事情:

{'Award': [<Badge: Copy of Copy of Blenbade>], 
 'Achievement': [<Badge: Copy of Blenbade>, <Badge: regergg>], 
 'Talent': [<Badge: Blender Brown Belt>, <Badge: Blender Blue Belt>, <Badge: Copy of Blender Blue Belt>, <Badge: fgdfgf Blender Blue Belt>, <Badge: Copy of Blender Brown Belt>, <Badge: Copy of fgdfgf Blender Blue Belt really long name >, <Badge: Copy of Blender Blue Beltcv x>, <Badge: regerggsdvsdv>]
}

我如何得到这样的东西?

    {'Award': {'Attribute1': "something",
               'Attribute2': 27,
               'queryset': [<Badge: Copy of Copy of Blenbade>]
              },
     'Achievement': {'Attribute1': "somethingelse",
               'Attribute2': 99658,
               'queryset': [<Badge: Copy of Blenbade>, <Badge: regergg>]
              },
     etc...
   } 

编辑2:或者更简单,基于尚的评论:

    [ 
      {'type': <BadgeType: Talent>,
       'queryset': [<Badge: Copy of Copy of Blenbade>]
      },
      {'type': <BadgeType: Achievement>,
       'queryset': [<Badge: Copy of Blenbade>, <Badge: regergg>]
      },
      etc...
    ]

这些属性都来自BadgeType模型,因此它们可以与t.name相同:

t.icon
t.description

编辑:BadgeType模型:

class BadgeType(models.Model):
    name = models.CharField(max_length=50, unique=True)
    icon = models.CharField(max_length=50, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    ....

1 个答案:

答案 0 :(得分:1)

要回答您的问题,请执行以下操作:

return {t.name : {'name': t.name, 
                  'icon': t.icon,
                  'description': t.description,
                  'queryset': self.get_queryset().get_type(t)
                 }
        for t in types}

但这根本不是必需的,django有一些非常方便的有用的数据库查找。您甚至不需要代码get_queryset().get_type(t),您可以这样做:

t.badge_set.all()

以下是描述RelatedManager用法的doc,默认情况下,您使用badge_set经理进行反向查询。

简而言之,如果您想对BadgeType个对象执行某些操作,您只需要types = BadgeType.objects.all(),其他所有内容都会附带。

您只需将types查询集传递给模板,然后在模板中执行:

{% for badge_type in types %}
    <ul>{{ badge_type.name }}</ul>
    {% for badge in badge_type.badge_set.all %}
        <li>{{ badge.<attribute> }}</li>
    {% endfor %}
{% endfor %}