Django 合并 2 个查询集覆盖注释

Django merge 2 querysets overide annotation

我有 2 个模型。 追随者 影响者

class Influencer(models.Model):
    username = models.CharField(
        _("username"), max_length=250, unique=True, null=False, blank=False, db_index=True)
    followers = models.ManyToManyField(
        "instagram_data.Follower", verbose_name=_("Followers"))

我想为来自 2 个影响者的关注者创建一个 QS:

influencer_choosen_by_user = [influ1name, influ2name]

qs = Follower.objects.none()
qs_influencers = Influencer.objects.filter(username__in=influencer_choosen_by_user)
for influencer_obj in qs_influencers.iterator():
    followers_of_influ_qs = influencer_obj.followers.all()  # get all followers of this influencer
    followers_of_influ_qs = followers_of_influ_qs.annotate(
        influencer_source=Value(f'followers/{influencer_obj.username}', CharField()))
    qs = qs | followers_of_influ_qs

预期结果:

qs = <[followers1,influ1name], [followers2, influ2name], [followers3, influ2name]>

注意:

一个关注者可以关注多个影响者

问题:

所有问题都是 influencer_source == influ1name none influ2name !!!

为什么?

您可以用一个额外的属性来注释关注者,该属性决定 Influencer 的用户名:

from django.db.models import F

Follower.objects.filter(
    <strong>influencer__username__in=influencer_choosen_by_user</strong>
).annotate(
    <strong>influencer=F('influencer__username')</strong>
)

在这种情况下,Follower 对象将有一个额外的属性 .influencer,其中包含影响者的用户名。如果一个关注者关注多个有影响力的人,则该关注者将在查询集中出现两次或更多次,每次都使用 .influencer influencer_choosen_by_user 的另一个用户名。