Mysql 在Django模型中扩展管理器内部的SQL查询?
下面是django文档中的示例,解释了管理器的用法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(*
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是否自动创建索引?”时,编辑您的问题以询问您真正的问题;然后你会得到一个对你有意义的答案。