我正在某个视图中显示影响者对象的行。这些影响者中的任何一个都可以位于一个影响列表对象中(由多对多关联)。我为每行添加了一个“添加到列表”按钮,这样用户可以将影响者添加到自己的列表中(用户和影响者列表由多对一关联)。当用户点击按钮时,一个弹出窗口打开,它显示用户的所有列表名称和每个列表影响者计数旁边。 这是我目前得到的: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
您可以直接将其.values(..)放在此处。然后它将返回InfluencerList带有附加属性的对象influencers_count:
# no .values(..)
context['myLists'] = logged_in_user.lists.annotate(
influencers_count=Count('influencers')
)
通常,最好不要使用它,.values(..) 除非您例如需要对不同于查询所依据的模型执行GROUP BY。但这不是事实。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。