Django first()for every item

b1uwtaje  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(194)

假设我有一个模型EventParticipant,它存储了给定Event的参与者数据。现在我想检索一个用户列表的 next 事件参与者。
以下内容:
EventParticipance.objects.filter(user__in=userlist, start__gte=timezone.now()).order_by(start)将为userlist中所有用户给予将来开始的所有事件参与者。但是,我只需要每个用户的第一个事件参与者。
在Posterre中,这可以通过以下方式实现(我认为):
EventParticipance.objects.filter(user__in=userlist, start__gte=timezone.now()).order_by(start).distinct('user')的值。“
但是,这不适用于sqlite或mysql。
很明显,如here所示,这是可行的,但我认为它会非常慢:

next_occurrence_ids = []
for user in userlist:
   id = EventParticipant.objects.filter(user=user, .....).order_by(start).values('id').first()
   next_occurrence_ids.append(id)
return EventParticipant.objects.filter(id__in=next_occurrence_ids

字符串
我还能用什么别的策略吗?

chhqkbe1

chhqkbe11#

你可以试试这样的:)

from django.db.models import Exists, OuterRef, Subquery

event_participances = (
    EventParticipance.objects.filter(
        start__gte=timezone.now(),
        user=OuterRef("pk")
    ).order_by("start")
)    
# Assuming userlist variable is queryset:

next_occurrence_ids = (
    userlist.filter(Exists(event_participances)).annotate(
        first_participance=Subquery(event_participances.values("pk")[:1])
    ).values_list("first_participance", flat=True)
)
return EventParticipance.objects.filter(id__in=next_occurrence_ids)

字符串

相关问题