在性能方面,在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 并避免原始查询。如果您决定使用不同的数据库模式并可能创建更高效​​的查询,它将对您有所帮助。