0

これは、マネージャーの使用を説明する 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から来たの? ResponseOpinionPollforeignKeyと関係があることを理解しています。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でどのように行われるかはわかりませんか?

4

1 に答える 1