【问题标题】:Create a dictionary of dictionaries from a Django queryset从 Django 查询集创建字典字典
【发布时间】:2015-11-28 16:36:36
【问题描述】:

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

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

等等

编辑:徽章类型模型:

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)
    ....

【问题讨论】:

  • 您需要向我们展示 BadgeType 模型。我们不知道AwardAchievement来自哪里。
  • 抱歉,我添加了更多细节,包括 BadgeType 型号和 Badge。但那些来自 t.name (BadgeType.name)
  • 那你是在正确的轨道上,你有没有尝试过return {t.name : {'name': t.name, 'icon': t.icon, 'description': t.description, 'queryset': self.get_queryset().get_type(t)} for t in types}
  • 谢谢!您可以将此作为答案发布吗?另外,似乎不是传递字段,我可以只传递对象本身 t 并在上下文中获取我需要的字段?
  • 另外,现在作为列表发送会更容易吗?因为我不需要带有标签't.name'的字典,因为我正在传递对象本身并且可以从对象中获取名称?

标签: python django dictionary django-queryset


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

【讨论】:

  • 但是如果我使用t.badge_set.all(),它们都会在同一个查询集中,对吧?我希望它们用BadgeType 分隔,因为我希望我的模板能够根据它们的BadgeType 分组显示它们(在完全不同的
      元素中)。
  • 不是同一个查询集。这里t是每个BadgeType取自typest.badge_set.all()返回所有具有外键tBadge。我更新了我的答案只是为了帮助你更多。
  • 谢谢你的教育,我现在明白了。这显然是我应该做的!
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2014-10-02
  • 2016-11-20
  • 1970-01-01
  • 2018-10-27
  • 2017-07-14
相关资源
最近更新 更多