- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有非常大的数据集并且还在不断增长,我需要创建许多过滤器,但它很快就会失控,我希望有人能帮助我将一些查询合并到一个调用中。下面是我的观点的开始。
调用 #1 - for 循环以显示所有结果的表格
traffic = Traffic.objects.all()
调用 #2 - 组合聚合总和查询
totals = Traffic.objects.aggregate(Sum('sessions'), Sum('new_users'), Sum('reminder'), Sum('campaigns'), Sum('new_sales'), Sum('sales_renewals'))
total_sessions = totals.get('sessions__sum')
total_new_users = totals.get('new_users__sum')
total_reminder = totals.get('reminder__sum')
total_campaigns = totals.get('campaigns__sum')
total_new_sales = totals.get('new_sales__sum')
total_sales_renewals = totals.get('sales_renewals__sum')
调用 #3、#4、#5、#6 等等... - 按月份和星期几过滤数据库
total_sessions_2014_m = Traffic.objects.filter(created__year='2014', created__week_day=2).aggregate(Sum('sessions'))
total_sessions_2014_m = Traffic.objects.filter(created__year='2014', created__week_day=3).aggregate(Sum('sessions'))
total_sessions_2014_m = Traffic.objects.filter(created__year='2014', created__week_day=4).aggregate(Sum('sessions'))
total_sessions_2014_m = Traffic.objects.filter(created__year='2014', created__week_day=5).aggregate(Sum('sessions'))
total_sessions_2014_m = Traffic.objects.filter(created__year='2014', created__week_day=6).aggregate(Sum('sessions'))
问题是,我需要再创建几十个过滤器,因为我有 3 年的数据,每列有多个数据点,我们需要计算总和。
问题:
如您所见,这很快就会失控。任何帮助将不胜感激。谢谢。
更新添加流量模型
class Timestamp(models.Model):
created = models.DateField()
class Meta:
abstract = True
class Traffic(Timestamp):
sessions = models.IntegerField(blank=True, null=True)
new_users = models.IntegerField(blank=True, null=True)
reminder = models.IntegerField(blank=True, null=True)
campaigns = models.IntegerField(blank=True, null=True)
new_sales = models.IntegerField(blank=True, null=True)
sales_renewals = models.IntegerField(blank=True, null=True)
# Meta and String
class Meta:
verbose_name = 'Traffic'
verbose_name_plural = 'Traffic Data'
def __str__(self):
return "%s" % self.created
最佳答案
有许多方法可以使用 Django ORM 优化数据库查询。像往常一样,Django documentation很棒并且有一个很好的列表。以下是查询优化的一些快速提示:
1) iterator()
如果您只访问一次queryset
。因此,例如,您可以将其用作,
traffic = Traffic.objects.all()
for t in traffic.iterator():
...
...
在定义您的模型
的字段时。作为Django documentation说,
This is a number one priority, after you have determined fromprofiling what indexes should be added. Use Field.db_index orMeta.index_together to add these from Django. Consider adding indexesto fields that you frequently query using filter(), exclude(),order_by(), etc. as indexes may help to speed up lookups.
因此你可以修改你的模型,
class Traffic(Timestamp):
sessions = models.IntegerField(blank=True, null=True, db_index=True)
new_users = models.IntegerField(blank=True, null=True, db_index=True)
reminder = models.IntegerField(blank=True, null=True, db_index=True)
campaigns = models.IntegerField(blank=True, null=True, db_index=True)
new_sales = models.IntegerField(blank=True, null=True, db_index=True)
3) prefetch_related()
或 select_related()
如果您在模型
中有关系,则可以选择使用prefetch_related
或select_related
。根据 Django documentation ,
select_related
通过创建一个 SQL join
并在 SELECT 语句中包含相关对象的字段来工作。为此,select_related
在同一数据库查询中获取相关对象。但是,为了避免通过连接“多”关系产生更大的结果集,select_related
仅限于单值关系 - 外键和一对一。
prefetch_related
另一方面,对每个进行单独查找关系,并在 Python 中进行“连接”。这允许它预取多对多和多对一对象,不能使用select_related
,以及select_related
支持的外键和一对一关系。
select_related
执行一个join
,prefetch_related
执行两个单独的查询。使用这些,您可以将查询速度提高多达 30%。
如果您的模板
设计允许您在多个页面中显示结果,您可以使用Pagination
。
您还需要了解 Django 查询集是惰性的,这意味着它在使用/评估之前不会查询数据库。 Django 中的查询集表示数据库中的许多行,可以选择通过查询进行过滤。例如,
traffic = Traffic.objects.all()
上面的代码没有运行任何数据库查询。您可以采用 traffic
查询集并应用其他过滤器,或将其传递给函数,并且不会向数据库发送任何内容。这很好,因为查询数据库是显着降低 Web 应用程序速度的事情之一。要从数据库中获取数据,您需要遍历查询集:
for t in traffic.iterator():
print(t.sessions)
Django 调试工具栏是一组可配置的面板,显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。这包括:
修改您的代码:(记住查询集是惰性的)
traffic = Traffic.objects.all()
totals = traffic.aggregate(Sum('sessions'), Sum('new_users'), Sum('reminder'), Sum('campaigns'), Sum('new_sales'), Sum('sales_renewals'))
total_sessions = totals.get('sessions__sum')
total_new_users = totals.get('new_users__sum')
total_reminder = totals.get('reminder__sum')
total_campaigns = totals.get('campaigns__sum')
total_new_sales = totals.get('new_sales__sum')
total_sales_renewals = totals.get('sales_renewals__sum')
t_2014 = traffic.filter(created__year='2014')
t_sessions_2014_wd2 = t_2014.filter(created__week_day=2).aggregate(Sum('sessions'))
...
...
对于模板中的调用#1 (for 循环以显示所有结果的表格):
{% for t in traffic.iterator %}
{{ t.sessions }}
...
...
{% endfor %}
关于python - 减少 Django 数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171506/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!