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
的另一个用户名。
我有 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
的另一个用户名。