首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django prefetch_related &预取嵌套

django prefetch_related &预取嵌套
EN

Stack Overflow用户
提问于 2018-07-06 13:54:59
回答 2查看 4.8K关注 0票数 3

我试图返回,对于每个UserProfile,它有一对多的Subscription,它对ArtistUserProfile都有一个Foreignkey,每个艺术家都有多个ReleaseGroupcount of 未来的发布组,每个UserProfile都有。

简而言之:我想为每个用户的所有订阅返回即将发布的所有版本的总数。

不过,在我数数之前,我被困住了.

代码语言:javascript
复制
    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会返回订阅的总数,但是rgggarti不会返回任何内容。这是如何做到的呢?

我尝试在self上使用过滤,比如filter(profile='userprofile)‘,但这会返回一个错误。如果我能过滤自我,我可能能让它工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-06 19:11:20

在尼古拉斯克拉德LeBlanc提供了大量帮助之后,下面是一个工作查询:

代码语言:javascript
复制
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()
            )
            ))

正如尼古拉斯所建议的,subscriptionsSubscription中的profile related_query_name集。

票数 5
EN

Stack Overflow用户

发布于 2018-07-06 17:08:52

代码语言:javascript
复制
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的讨论,我们希望使用此方法,但不使用日期筛选器。

代码语言:javascript
复制
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.modelsCaseWhen作为OP和我发现的。请参阅他对已完成查询的答复。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51212021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档