我试图返回,对于每个UserProfile,它有一对多的Subscription,它对Artist和UserProfile都有一个Foreignkey,每个艺术家都有多个ReleaseGroup,count of 未来的发布组,每个UserProfile都有。
简而言之:我想为每个用户的所有订阅返回即将发布的所有版本的总数。
不过,在我数数之前,我被困住了.
context['test_totals'] = UserProfile.objects.prefetch_related(
Prefetch('subscription_set', queryset=Subscription.objects.
prefetch_related(Prefetch('artist', queryset=Artist.objects.
prefetch_related(Prefetch('release_groups',
queryset=ReleaseGroup.objects.filter(
release_date__gte=startdate
), to_attr='rggg')), to_attr='arti')), to_attr='arts'))在模板中访问userprofile.arts|length会返回订阅的总数,但是rggg和arti不会返回任何内容。这是如何做到的呢?
我尝试在self上使用过滤,比如filter(profile='userprofile)‘,但这会返回一个错误。如果我能过滤自我,我可能能让它工作吗?
发布于 2018-07-06 19:11:20
在尼古拉斯克拉德LeBlanc提供了大量帮助之后,下面是一个工作查询:
UserProfile.objects.annotate(rgs=Count(
Case(
When(subscriptions__artist__release_groups__release_date__gte=startdate, then=F('subscriptions__artist__release_groups__release_date')),
When(subscriptions__artist__release_groups__release_date__lt=startdate, then=None),
output_field=DateField()
)
))正如尼古拉斯所建议的,subscriptions是Subscription中的profile related_query_name集。
发布于 2018-07-06 17:08:52
context['test_totals'] = UserProfile.objects.prefetch_related(
Prefetch(
'subscription_set',
queryset=Subscription.objects.select_related(
'artist', 'profile').prefetch_related(
Prefetch(
'artist__release_groups',
queryset=ReleaseGroup.objects.filter(
release_date__gte=startdate
),
to_attr='release_groups'
)
),
to_attr='subscriptions'
)
)我还没有机会测试这个,但它应该能用。您在不支持的外键prefetch_related上使用了artist;prefetch_related是用于关系以支持项目列表的。因此,您预取subscription_set并在艺术家上使用select_related,然后预取artist__release_groups关系。现在你应该有profile_instance.subscriptions ...subscriptions[index].artist ...subscriptions[index].artist.release_groups了
*编辑:
经过与OP的讨论,我们希望使用此方法,但不使用日期筛选器。
UserProfile.objects.annotate(
rgs=Count(
'subscription_set__artist__release_groups',
filter=Q(subscription_set__artist__release_groups__release_date__gte=startdate),
distinct=True
)
)真正的答案是使用django.db.models、Case和When作为OP和我发现的。请参阅他对已完成查询的答复。
https://stackoverflow.com/questions/51212021
复制相似问题