これは、マネージャーの使用を説明する django docsのコードです。
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()
このコードに基づいて 2 つの質問があります。
1) どこr.poll_id
から来たの? ResponseはOpinionPollforeignKey
と関係があることを理解しています。OpinionPollテーブルとResponseテーブルを結合するには、ID で結合する必要があります。ただし、 Responseでポーリング ID にアクセスするには、r.poll.id を実行します。構文は、MySQL 構文です。r.poll_id
なぜ GROUP BY p.id、p.question、p.poll_date? GROUP BY p.id だけでは不十分なのはなぜですか?
2) 上記の生の SQL クエリを django ORM クエリに変換することは可能ですか?もしそうなら、それはどのように見えるでしょうか?
私は SQL の専門家ではありません。ばかげているように聞こえるかもしれませんが、ご容赦ください
編集:
Django の外部で OpinionPoll および Response テーブルを作成したい場合、SQL ステートメントはどのようになりますcreate
か?
Django シェルで実行すると、
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;
REFERENCES "myapp_opinionpoll"
以上のようなものが見えますCREATE INDEX
。これがSQLでどのように行われるかはわかりませんか?