从 Django 查询集创建字典
Create a dictionary of dictionaries from a 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:或者更简单,基于 Shang 的评论:
[
{'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)
....
要回答您的问题,只需执行以下操作:
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 %}
我目前正在创建这样的查询集字典:
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:或者更简单,基于 Shang 的评论:
[
{'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)
....
要回答您的问题,只需执行以下操作:
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 %}