我使用以下代码从字典中获取数据。
test = self.events_max_total_gross()
events = organizer.events.all()
for event in events:
test.get(event.pk, {}).values()
[...]
我使用此查询集来获取数据。我的问题是:最后的转换有意义吗?还是有更好的方法来访问dict(无需先转换)。由于其中有几种,我的方法似乎不遵循DRY原理。
def events_max_total_gross(self):
events_max_total_gross = (
Event.objects.filter(
organizer__in=self.organizers,
status=EventStatus.LIVE
)
.annotate(total_gross=Sum(F('tickets__quantity') * F('tickets__price_gross')))
.values('pk', 'total_gross')
)
"""
Convert this
[
{
'pk': 2,
'total_gross': 12345
},
{
'pk': 3,
'total_gross': 54321
},
...
]
to this:
{
2: {
'total_gross': 12345,
},
3: {
'total_gross': 12345,
}
...
}
"""
events_max_total_gross_transformed = {}
for item in events_max_total_gross:
events_max_total_gross_transformed.setdefault(
item['pk'], {}
).update({'total_gross': item['total_gross']})
return events_max_total_gross_transformed
答案 0 :(得分:1)
使用:
transformed = {
v['pk']: { 'total_gross': v['total_gross'] } for v in events_max_total_gross
}
这称为python dict理解。如果您需要教程或示例,请用Google来表示。
答案 1 :(得分:0)
如果我对它的理解正确,那么对于每个组织者的活动,您都需要total_gross
,您可以像这样查询,而不是循环查看事件和events_max_total_gross。
首先获取该特定组织者的所有事件。
event_ids = Event.objects.filter(organizer=organizer).values_list('id',flat=True)
然后运行此命令
Event.objects.filter(
id__in=event_ids,
organizer__in=self.organizers,
status=EventStatus.LIVE
)
.annotate(total_gross=Sum(F('tickets__quantity') * F('tickets__price_gross')))
.values('pk', 'total_gross')
)
这样,您将保存dict的转换并再次将其循环。
如果由于其他一些要求而需要执行此操作,则可以使用python dict理解:
events_max_total_gross_transformed = {
event['pk']: { 'total_gross': event['total_gross'] } for event in events_max_total_gross
}
但是,您可能会想一想proxy-models,所以有很多帮助。在这里,您可以编写管理器功能来帮助您进行查询。