[英]Django: Transform dict of queryset
我使用以下代碼從dict中獲取數據。
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
采用:
transformed = {
v['pk']: { 'total_gross': v['total_gross'] } for v in events_max_total_gross
}
這稱為python dict理解。 如果您需要教程或示例,請用Google的術語。
如果我對它的理解正確,那么對於每個組織者的事件,您都需要total_gross
,您可以像這樣查詢,而不是循環查看event和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 comprehension:
events_max_total_gross_transformed = { event['pk']: { 'total_gross': event['total_gross'] } for event in events_max_total_gross }
但是,當您擁有其中的幾種時,您可能想看看也可能有幫助的代理模型 。 在這里,您可以編寫管理器功能來幫助您進行查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.