为此目的的 Django ORM 查询

Django ORM query for this purpose

我在某些视图中显示了我的 Influencer 对象的行。这些影响者中的任何一个都可以在 InfluencerList 对象中(多对多关联)。我在每一行添加了一个 "Add to List" 按钮,这样用户就可以将有影响力的人添加到他自己的列表中(用户和有影响力的列表是多对一相关的)。当用户单击该按钮时,会打开一个弹出窗口 window,它会向用户显示所有列表名称以及每个列表旁边的影响者数量。

这是我目前得到的结果:https://pasteboard.co/IMHHSa6.png

我想做的是,如果这些列表中的任何一个包含相关影响者,则默认选中其中一些复选框。这是我当前的代码:

models.py:

class Influencer(models.Model):
    # fields are not included for clarity
    pass

class InfluencerList(models.Model):
    name = models.CharField('Name:', max_length=20, blank=False)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')
    influencers = models.ManyToManyField('Influencer', related_name='lists') 

views.py:

class InfluencerListView(LoginRequiredMixin, ListView):
    model = Influencer
    # template_name = "app1/influencer_list.html"
    context_object_name = 'influencers' # not necessary, default is object_list
    #queryset = Influencer.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        logged_in_user = self.request.user
        context['myLists'] = logged_in_user.lists.values('name').annotate(
        influencers_count=Count('influencers'))    # returns a list of dicts
        return context

views.py

{% for myList in myLists %}
    <label class="list_existing_item">
        <input class="checkbox-input" id="myCheckbox" type="checkbox" 
        data-inf_id="{{influencer.id}}" data-list_id="{{myList.id}}"
        onclick="myFunc(this)">
        {{myList.name}}
        <span class="list_count"> {{myList.influencers_count}}  </span>                        
    </label>
{% endfor %}

我知道我必须传递关于哪个影响者属于哪个列表的信息,所以我尝试了这个查询:

context['myLists'] = logged_in_user.lists.values('name','influencers').annotate(
influencers_count=Count('influencers')    

但它 returns 像这样的查询集,它不允许我使用计数或遍历列表并创建我的 html 元素:

QuerySet [<br>
{'name': 'list1', 'influencers': 2222, 'influencers_count': 1},<br> 
{'name': 'list1', 'influencers': 2345, 'influencers_count': 1}, <br>
{'name': 'List123', 'influencers': 2222, 'influencers_count': 1}, <br>
{'name': 'list2', 'influencers': None, 'influencers_count': 0}
]

如果我有一个查询 returns 前两个带有 'influencers_count':2

的 dic,那就太好了 为了以后的目的,我还阅读了一些 AJAX 教程,了解如何通过选中或取消选中复选框来将我的影响者添加或删除到个人列表中,但我想我不知道在哪里搜索它...首先,我讨厌意大利面条代码,我想以适当的方式完成这些要求,感谢您的帮助或建议。

您只需将 .values(..) 放在这里即可。然后它将 return InfluencerList 个对象,带有一个额外的属性 influencers_count:

# <i>no</i> .values(..)
context['myLists'] = logged_in_user.lists.annotate(
    influencers_count=Count('influencers')
)

一般来说,最好不要使用.values(..) 除非例如你需要对某些东西执行GROUP BY不同于您跨越查询的模型。但不是这里的情况。