开发者社区> 问答> 正文

Django ORM查询

我正在某个视图中显示影响者对象的行。这些影响者中的任何一个都可以位于一个影响列表对象中(由多对多关联)。我为每行添加了一个“添加到列表”按钮,这样用户可以将影响者添加到自己的列表中(用户和影响者列表由多对一关联)。当用户点击按钮时,一个弹出窗口打开,它显示用户的所有列表名称和每个列表影响者计数旁边。 这是我目前得到的: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')    

但它会返回一个类似这样的查询集,这就不允许我使用count或遍历列表来创建我的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}
]

如果有一个返回前两个dics的‘影响力s_count’:2的查询就好了 为了以后的目的,我还阅读了一些AJAX教程,教我如何通过勾选或取消勾选复选框来添加或删除个人列表中的影响者,但我想我不知道到哪里去搜索它……首先,我讨厌意大利面条式的代码,我想用一种合适的方式来完成这些要求,谢谢你的帮助和建议。 问题来源StackOverflow 地址:/questions/59466014/django-orm-query-for-this-purpose

展开
收起
kun坤 2019-12-25 15:54:08 527 0
1 条回答
写回答
取消 提交回答
  • 您可以直接将其.values(..)放在此处。然后它将返回InfluencerList带有附加属性的对象influencers_count:

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

    通常,最好不要使用它,.values(..) 除非您例如需要对不同于查询所依据的模型执行GROUP BY。但这不是事实。

    2019-12-25 17:33:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载