Django:查询的转换dict

2024-04-25 22:08:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下代码从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

Tags: 方法intestselfeventforeventsitem
2条回答

用途:

transformed = { 
    v['pk']: { 'total_gross': v['total_gross'] } for v in events_max_total_gross 
}

这称为python dict理解。如果你想要教程或例子,可以用谷歌搜索这个词。你知道吗

如果我理解正确的话,那么对于您需要的每一个组织者的事件,您可以这样查询,而不是在循环中查看事件和事件的最大总数。你知道吗

  1. 先把那个组织者的所有活动都拿出来。你知道吗

    event_ids = Event.objects.filter(organizer=organizer).values_list('id',flat=True)

  2. 运行以下命令:

    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,这可能会有所帮助。在这里,您可以编写管理器函数来帮助您进行查询。你知道吗

相关问题 更多 >