我使用以下代码从dict中获取数据
test = self.events_max_total_gross()
events = organizer.events.all()
for event in events:
test.get(event.pk, {}).values()
[...]
我使用这个查询集来获取数据。我的问题是:最后的转换有意义吗?还是有更好的方法访问dict(不首先转换它)。由于我有几个这样的方法,我的方法似乎没有遵循干涸的原则。你知道吗
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
用途:
这称为python dict理解。如果你想要教程或例子,可以用谷歌搜索这个词。你知道吗
如果我理解正确的话,那么对于您需要的每一个组织者的事件,您可以这样查询,而不是在循环中查看事件和事件的最大总数。你知道吗
先把那个组织者的所有活动都拿出来。你知道吗
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,这可能会有所帮助。在这里,您可以编写管理器函数来帮助您进行查询。你知道吗
相关问题 更多 >
编程相关推荐