18

ですから、コンピュータ言語を学ぶのはこれが初めてです。そして、python と django を選びました。これで、python と django の基本概念の多くを理解できました。ビューやその他すべてのものを含む新しいページを作成できます。しかし、1 対 1、多対 1、多対多などの関係については、いまだに混乱しています。誰か私に説明してください。どのように使用できますか?私は本当に知る必要があります。

ありがとう。

4

2 に答える 2

97

特に、複雑な db 設計を容易にする django では、SQL レベルでどのように動作するかを理解して、自分が行っていることをよりよく理解することが非常に重要だと思います。これを理解するための最良の方法は例だと思います。

最初に理解しておくべきことは、各 SQL テーブルには「主キー」と呼ばれる 1 つのフィールド (通常は自動的にインクリメントされる) があるということです。このフィールドは、行ごとに一意の値を持つ列です。

django で作成者を表すモデルを作成するとします。このモデルには、first_name、last_name、および電子メールを含むオプションのフィールドの 3 つのフィールドがあります。また、Django は自動的に主キー フィールドを追加し、それを pk と呼びます (主キーとして使用する独自のフィールドを定義することもできますが、通常はそうしません)。したがって、manage.py syncdb コマンドを使用すると、次のようなテーブルが作成されます。

+----+------------+-----------+-----------------------+
| pk | first_name | last_name |         email         |
+----+------------+-----------+-----------------------+

新しい値 (「Stephen King」など) を追加すると、次のように authors テーブルに追加されます。

+----+------------+-----------+-----------------------+
| pk | first_name | last_name |         email         |
+----+------------+-----------+-----------------------+
|  1 | Stephen    | King      | stephenking@gmail.com |
+----+------------+-----------+-----------------------+

別のものを追加しましょう:

+----+------------+-----------+-----------------------+
| pk | first_name | last_name |         email         |
+----+------------+-----------+-----------------------+
|  1 | Stephen    | King      | stephenking@gmail.com |
|  2 | J.D.       | Salinger  |                       |
+----+------------+-----------+-----------------------+

それは簡単です。次に、Book という新しいモデルを追加します。

+----+--------------+--------+--------+
| pk |    title     | genre  | author |
+----+--------------+--------+--------+
|  1 | Pet Semetary | Horror |      1 |
+----+--------------+--------+--------+

今、私がそこで何をしたか見てください。author のフィールドで、Stephen King の主キーの値を book に指定しました。覚えておいてください。これは一意であるため、Stephen King のみがフェッチされます。これはForeignKeyです。関連するテーブルの pk を指し、多対 1 の関係を表します。つまり、さまざまな本が 1 人の著者の同じ pk を指すことができますが、その逆はできません。そうすれば、各著者は多くの関連本を持つことができますが、すべての本には著者が 1 人しかいません。

ここで、スティーブン・キングの別の本を追加したいとしましょう。これはタリスマンと呼ばれます:

+----+--------------+---------+--------+
| pk |    title     |  genre  | author |
+----+--------------+---------+--------+
|  1 | Pet Semetary | Horror  |      1 |
|  2 | The Talisman | Fantasy |      1 |
+----+--------------+---------+--------+

しかし、ちょっと待ってください。この最後のものは、実際にはピーター・ストラウブという別の著者と共著でした。どうしようか?最初に Straub を author テーブルに追加する必要があります。

+----+------------+-----------+-----------------------+
| pk | first_name | last_name |         email         |
+----+------------+-----------+-----------------------+
|  1 | Stephen    | King      | stephenking@gmail.com |
|  2 | J.D.       | Salinger  |                       |
|  3 | Peter      | Straub    |                       |
+----+------------+-----------+-----------------------+

しかし、タリスマンが2 つの異なる行に関連していることをテーブルにどのように伝えるのでしょうか? シンプル - 3 番目のテーブルを使用して 2 つをリンクします。

したがって、テーブル 1 は作成者になります (上記を参照)。2番目のテーブルは本になります。3 番目のテーブルは authors_books と呼ばれ、次のようになります。

+------------+--------------+
| pk_of_book | pk_of_author |
+------------+--------------+
|          1 |            1 |
|          2 |            1 |
|          2 |            3 |
+------------+--------------+

見る?テーブル間で異なる pk をリンクする方法を示します。これは、多対多の関係です。異なる書籍を異なる著者に関連付けることができ、その逆も成り立つからです。そして、私が説明した 3 つのテーブルのスキーマは、そのための基本的な設計です。

OneToOneリレーションシップは ForeignKey に似ていますが、 があるunique=Trueため、1 つのオブジェクトから別のオブジェクトへのリンクしかできません。それだけです。通常、元のモデルを変更せずに特定のモデルを拡張する場合に使用されます (たとえば、組み込みのユーザー モデルに独自のカスタム フィールドを追加する場合など)。

物事を解決するのに役立つことを願っています。Django は非常に優れているため、SQL を使用する必要はほとんどありませんが、バックグラウンドで何が起こっているかを少し知っておくと役に立ちます。これらの関係については、ウェブ上にたくさんの説明があります。私はそれについての簡単な一般的なイントロダクションだけを提供しました。少しググって、自分で理解を深めることを強くお勧めします。幸運を!

于 2013-10-28T20:42:29.900 に答える
2

リレーションは、MySQL のようなリレーショナル データベースの一般的な概念です。リレーションと Django の ORM に関するすべては、 https ://docs.djangoproject.com/en/dev/topics/db/models/#relationships で非常によく説明されています。

これが正しい方向につながることを願っています。

于 2013-10-28T18:03:45.963 に答える