Annotated queryset + Prefetch object

1,779 views
Skip to first unread message

Jose Kilo

unread,
Mar 4, 2017, 1:36:20 PM3/4/17
to Django users
Hi all,

I'm trying to use an annotated queryset inside a Prefetch object. For some reason I'm not getting the expected result.
This is a simplified version of my models and query.


class User(models.Model):

    following
= models.ManyToManyField('User', related_name='followers', through='Follow')


class Follow(models.Model):

    following
= models.ForeignKey(User, on_delete=models.CASCADE, related_name='_followed')
    followed
= models.ForeignKey(User, on_delete=models.CASCADE, related_name='_following')


def test():

   
User.objects.all().delete()

    user_1
= User.objects.create()
    user_2
= User.objects.create()

   
Follow.objects.create(following=user_1, followed=user_2)

    queryset
= (
       
User.objects.all()
       
.prefetch_related(
           
Prefetch(
               
'followers', to_attr='prefetched_annotated_followers',
                queryset
=(User.objects.all().annotate(
                    followers_count
=Count('followers', distinct=True),
               
))
           
),
           
Prefetch(
               
'followers', to_attr='prefetched_followers',
                queryset
=User.objects.all()
           
),
       
)
   
)

    user
= queryset.last()
   
print(list(user.followers.all()))            # [<User: User object>]
   
print(user.prefetched_followers)             # [<User: User object>]
   
print(user.prefetched_annotated_followers)   # []

   
return queryset


Why the last result is empty ?

Just in case, I added 'prefetched_followers' to compare both results. If I remove it, 'prefetched_annotated_followers' still doesn't get anything.

Simon Charette

unread,
Apr 8, 2017, 8:58:55 PM4/8/17
to Django users
Hello Jose,

I wouldn't be surprised if this was caused by a Django bug with prefetches doing
weird things when the same model is referenced through different relations[0].

Simon

Jose Kilo

unread,
Apr 19, 2017, 2:15:50 PM4/19/17
to Django users
Hello Simon,

That issue looks very similar indeed. I will keep an eye on that ticket.

Thanks for your reply.

Jose
Reply all
Reply to author
Forward
0 new messages