Mysql 在Django模型中扩展管理器内部的SQL查询?

Mysql 在Django模型中扩展管理器内部的SQL查询?,mysql,django,django-models,django-managers,Mysql,Django,Django Models,Django Managers,下面是django文档中的示例,解释了管理器的用法 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(*

下面是django文档中的示例,解释了管理器的用法

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

class OpinionPoll(models.Model):
    question = models.CharField(max_length=200)
    poll_date = models.DateField()
    objects = PollManager()

class Response(models.Model):
    poll = models.ForeignKey(OpinionPoll)
    person_name = models.CharField(max_length=50)
    response = models.TextField()
基于此代码,我有两个问题:

1)
r.poll\u id
来自哪里?我了解回复与OpinionPoll有
foreignKey
关系。为了将OpinionPoll表与Response表联接,我需要在它们的id上联接。 但是,要访问响应中的轮询id,我将执行r.poll.id。 是一种MySQL语法,
r.poll\u id

为什么按p.id、p.问题、p.poll\U日期分组?为什么仅凭p.id分组是不够的

2) 是否可以将上述原始SQL查询转换为django ORM查询?如果可以,会是什么样子

我不是SQL高手。所以请容忍我,如果这听起来很愚蠢的话

编辑:

如果我想在Django之外创建OpinionPoll和Response表,那么
create
的SQL语句会是什么样子

在Django shell中,当我运行时

python manage.py sqlall appname

我得到以下信息:

BEGIN;

CREATE TABLE "myapp_opinionpoll" (
    "id" integer NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "poll_date" date NOT NULL
)
;
CREATE TABLE "myapp_response" (
    "id" integer NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "myapp_opinionpoll" ("id"),
    "person_name" varchar(50) NOT NULL,
    "response" text NOT NULL
)
;
CREATE INDEX "larb_response_70f78e6b" ON "myapp_response" ("poll_id");

COMMIT;
我在上面看到类似于
的引用“myapp\u opinionpoll”
创建索引。我不确定

如果在SQL中是这样做的?

[1]Django模型将创建像
fieldname\u id
这样的外键作为mysql中的字段。您可以看到字段
poll=models。ForeignKey(OpinionPoll)
创建此字段

关于
分组依据
,因为这些字段正是所选择的字段,除了聚合函数外,对它们进行精确分组可以使它们区别开来

[2] 试试这个,我没有调试,但可能会有帮助:

from django.db.models import Count
OpinionPoll.objects.annotate(num_responses=Count('response'))

有关聚合的更多信息,请参阅文档:

谢谢。如果您认为这是mysql的基础问题,请参阅我上面的编辑和帮助,
python manage.py sqlall appname
已经告诉了您一切。您想知道如何将现有数据库转换为django模型吗?不清楚你想解决什么问题。不,我不是在问这个问题。我问的是,如果我在Django之外创建表,SQL查询会是什么样子。我上面的编辑可以更好地解释我猜我没有得到你想要的。是否要获取现有models.py,然后尝试手动创建SQL查询,以了解查询是如何编写的?您的问题“我不确定这是如何在SQL中完成的?”-非常令人困惑,因为您粘贴的是SQL。如果您曾经只使用过MySQL,您可能会惊讶地发现,每个数据库提供程序都有自己的SQL风格,有些比其他的更严格(符合标准)。这就是方法。好的。我粘贴的是django在运行sqlall myapp时吐出的sql语句。请暂时忘记django。如果我想创建上面显示的两个表,我将如何在MySQL中创建它们。我不清楚我是否应该像上面所示明确使用
引用
创建索引
,或者MYsQl中有一条捷径可以自动执行
创建索引
,我想你通过在Manager和django中谈论查询,把包括你自己在内的所有人都弄糊涂了;当您真正的问题只是“MySQL是否自动创建索引?”时,编辑您的问题以询问您真正的问题;然后你会得到一个对你有意义的答案。