在性能方面,在django中修改queryset和通过managers写SQL哪个更好?
In terms of performance, which one is better modifying queryset or writing SQL through managers in django?
在性能方面,修改queryset和通过django中的managers编写SQL哪个更好?
class DahlBookManager(models.Manager):
def get_queryset(self):
return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')
或
class PollManager(models.Manager):
def with_counts(self):
from django.db import connection
cursor = connection.cursor()
cursor.execute("""
SELECT p.id, p.question, p.poll_date, COUNT(*)
FROM polls_opinionpoll p, polls_response r
WHERE p.id = r.poll_id
GROUP BY p.id, p.question, p.poll_date
ORDER BY p.poll_date DESC""")
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0], question=row[1], poll_date=row[2])
p.num_responses = row[3]
result_list.append(p)
return result_list
我想这是第一个 - 但这不是一场公平的比赛。
你的第二个纯 sql 语句也必须进行分组和排序,而你的第一个语句没有,所以第一个只是 WHERE
.
它可能是第二个的原因是因为第一个得到的是 *
而不是你需要的 3 个项目,所以你最好选择以下项目:
super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl').values('id',
'question',
'poll_date')
现在这可能只是我的意见,但对于您在 django 中执行的大多数查询,您应该使用 django 并避免原始查询。如果您决定使用不同的数据库模式并可能创建更高效的查询,它将对您有所帮助。
在性能方面,修改queryset和通过django中的managers编写SQL哪个更好?
class DahlBookManager(models.Manager):
def get_queryset(self):
return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')
或
class PollManager(models.Manager):
def with_counts(self):
from django.db import connection
cursor = connection.cursor()
cursor.execute("""
SELECT p.id, p.question, p.poll_date, COUNT(*)
FROM polls_opinionpoll p, polls_response r
WHERE p.id = r.poll_id
GROUP BY p.id, p.question, p.poll_date
ORDER BY p.poll_date DESC""")
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0], question=row[1], poll_date=row[2])
p.num_responses = row[3]
result_list.append(p)
return result_list
我想这是第一个 - 但这不是一场公平的比赛。
你的第二个纯 sql 语句也必须进行分组和排序,而你的第一个语句没有,所以第一个只是 WHERE
.
它可能是第二个的原因是因为第一个得到的是 *
而不是你需要的 3 个项目,所以你最好选择以下项目:
super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl').values('id',
'question',
'poll_date')
现在这可能只是我的意见,但对于您在 django 中执行的大多数查询,您应该使用 django 并避免原始查询。如果您决定使用不同的数据库模式并可能创建更高效的查询,它将对您有所帮助。