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