python - 用于此目的的 Django ORM 查询

标签 python django ajax django-orm

我正在某些 View 中显示我的影响者对象的行。这些影响者中的任何一个都可以位于 InfluencerList 对象中(多对多关联)。我在每一行添加了一个“添加到列表”按钮,以便用户可以将影响者添加到他自己的列表中(用户和影响者列表是多对一相关的)。当用户单击该按钮时,将打开一个弹出窗口,它向用户显示所有列表名称以及每个列表旁边的影响者计数。

这是我到目前为止得到的: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')    

但它返回一个像这样的查询集,这不允许我使用计数或迭代列表并创建我的 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}
]

如果有一个查询返回前两个带有 'influencers_count':2

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

最佳答案

您只需将 .values(..) 拖放到此处即可。然后它将返回 InfluencerList 对象,并带有额外的属性 influencers_count:

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

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

关于python - 用于此目的的 Django ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59466014/

相关文章:

python - Django 1.8.2(使用Python 3.4): How is a CharField with choices stored in a MySQL table with an ENUM column?

python - 在 Django 中对 STATIC_URL 使用相对与绝对 URL

ajax - 在 Django 中,如何单击按钮调用 View 然后重新加载页面

python - 如何与通配符合并? - Pandas

python - 如何在 OS X 上的 Emacs 中设置 Python 解释器?

python - 使用 python 抓取 iFrame

Django Rest Framework 权限检查创建

python - 用于在同一模块中写入和读取数据的自定义 stdout 和 stdin - Python

ajax - :ajax update not working with p:selectBooleanCheckbox

javascript - jquery 附加和 jquery html 在 IE 7 或 8 中不起作用