我必须说,我真的很喜欢django,以及该框架如何处理很多事情,但是有时候,似乎有太多的方法可以做同样的事情,有时候,人们只是想知道某种特定的方法是最好。我有一条过滤的代码行,我最初是这样写的。
Post.objects.filter(author=user).filter(approved=True).order_by('-date_posted')
我正在检查代码,只是想将这一行更改为
Post.objects.filter(author=user, approved=True).order_by('-date_posted')
我知道它仍然可以工作,但仍然感到惊讶,它确实做了同样的事情。因此,我的问题是,在这种情况下,人们如何知道哪种方法更好? Cos的两行代码都在数据库级别进行过滤。
在这种情况下,这些不同的表达式(我认为)将导致执行相同的SQL。在您的python代码需要知道答案之前,查询将不会执行。您可以在每个方法上调用.explain()方法,以了解有关数据库操作的更多信息。
Django docs, querysets are lazy
话虽如此,我认为它们在此示例中是相同的,只是因为具有两个字段的filter()始终暗含它们之间的逻辑“与”,因此结果将是相同的。使用其他一些功能,也许优先顺序中可能包含一些逻辑,这些逻辑将更改结果查询集和SQL。