这一切都始于我尝试将切片应用于查询集以限制它。据我了解 documentation它应该将结果限制为 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 %}
这很奇怪:如果我在 View 中使用 len(qs)
,我会得到 10!但在模板中我得到 300!它不适合我的头脑。
我也尝试在模板中应用 slice 而不是我的 View :
{% for message in messages|slice:":10" %}
但一切都没有改变。
我的模板中有所有消息,而不是 10 条。这怎么可能?
PS:数据库类型是sqlite。
最佳答案
是documented that it is not advisable to futher modify a queryset after slicing :
Also note that even though slicing an unevaluated
QuerySet
returns another unevaluatedQuerySet
, modifying it further (e.g., adding more filters, or modifying ordering) is not allowed, since that does not translate well into SQL and it would not have a clear meaning either.
您应该更改顺序,例如:
def get_queryset(self, *args, **kwargs):
return Message.objects.filter(Target_id=self.dialog).annotate(
sender_id=Max('Sender__id')
)[:10]
所以你首先 .filter(..)
/.annotate(..)
,然后切片。
关于python - Django 中的切片与查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136129/