python - django中的切片与查询集
问题描述
这一切都始于我试图将切片应用于查询集以限制它。据我了解文档应该将结果限制为 10 个条目:
def get_queryset(self, *args, **kwargs):
qs = Message.objects.all()
qs = qs.filter(Target_id=self.dialog)[:10] # here the limit
qs = qs.annotate(sender_id=Max('Sender__id'))
return qs
但实际上在模板中,请求将所有记录返回给我,但仅将注释应用于前 10 条。我不知道为什么。
我认为整个原因是注释。
然后我删除最后一行(带注释)。但是,我在模板中获得了所有记录而不是 10 条。这与我没有制作切片的结果相同。
在我的模板中,我没有做任何不寻常的事情:对我的查询集的迭代:
{% for message in messages %}
{{message}}
{% endfor %}
这很奇怪:如果我考虑len(qs)
一下,我会得到 10!但在模板中我得到 300!它不适合我的头脑。
我还尝试在模板中应用切片而不是我的视图:
{% for message in messages|slice:":10" %}
但一切都没有改变。
我的模板中收到了所有消息,而不是 10 条。这怎么可能?
PS:数据库类型是sqlite。
解决方案
另请注意,即使对未评估的切片
QuerySet
返回另一个未评估QuerySet
,也不允许对其进行进一步修改(例如,添加更多过滤器或修改排序),因为这不能很好地转化为 SQL,而且它也没有明确的含义。
您应该更改顺序,例如:
def get_queryset(self, *args, **kwargs):
return Message.objects.filter(Target_id=self.dialog).annotate(
sender_id=Max('Sender__id')
)[:10]
所以你首先 .filter(..)
/ .annotate(..)
,然后你切片。
推荐阅读
- javascript - 如何使用电子标签 webview 从浏览器窗口到标签进行通信?
- reactjs - Disabling console log react
- c++ - I'm using _getch() in C++ and i want to know if it can detect the arrow keys instead of the other keys
- python - How should I write the error handling in this situation? I want the program to say that the file does not exist, and then run and ask again for a file
- r - 如何从 R 中的数据框中提取特定范围的小时数
- python - 调整 PyGame 屏幕大小
- prolog - 如何在 Prolog 中使用 DCG 生成长度为 n-1 的所有二进制字符串的语言
- kibana - Opendistro Kibana:在插件中获取用户信息(如角色)
- html - 引导下拉菜单中的链接(a href)不起作用
- c++ - C++ 在执行 windows.h 时跳转到 case 标签错误