質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1200閲覧

モデルクラスのプロパティについて

aae_11

総合スコア178

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/12 03:50

編集2019/11/12 03:51

現在Djangoを公式チュートリアルで学習しているのですが、公式にも記載があります以下の部分におきまして、「models」クラスについて理解したかった場合、対話モードにて、「from django.db import models]としてから、「 models」として実行しました。

python

1from django.db import models 2 3 4class Question(models.Model): 5 question_text = models.CharField(max_length=200) 6 pub_date = models.DateTimeField('date published') 7 8 9class Choice(models.Model): 10 question = models.ForeignKey(Question, on_delete=models.CASCADE) 11 choice_text = models.CharField(max_length=200) 12 votes = models.IntegerField(default=0)

その結果、

<module 'django.db.models' from '/Users/ユーザー名/.pyenv/versions/3.7.5/lib/python3.7/site-packages/django/db/models/__init__.py'>

このように表示されました。このことから、question_text = models.CharField(max_length=200)ここの部分などでは「/models/init.py」ファイル(実際には、init.pyファイルには「CharField」プロパティはない為、importしてきたファイル)の「CharField」プロパティを参照しているとの理解で合っていますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Pythonでファイルにインデントなしで

x = 1

と書くと、モジュールの名前空間にxという名前で1という値を束縛します。

「モジュールの名前空間」に束縛された変数のことを普段「グローバル変数」と呼んでいます。


同じくファイルにインデントなしで

import a

と書くと

  1. a というモジュールをロードする
  2. ロードしたモジュールを「モジュールの名前空間」にaという名前で束縛する

ということが起こります。
それがimportの機能です。

つまり、ここでaそのモジュールのグローバル変数になるわけです。


パッケージdjango.db.modelに相当する、ディレクトリ(どこか)/django/db/modelにある__init__.pyというファイルが作る名前空間は、パッケージdjango.db.model配下の名前空間と等しいです。
言い換えると(どこか)/django/db/modelにある__init__.pyで束縛されたグローバル変数が、パッケージdjango.db.modelに属する属性名として使えるわけです。

ところで、先ほどimport aと書くとaがそのモジュールのグローバル変数になります、とも書きました。

合わせると(どこか)/django/db/modelにある__init__.py内で、import文によって束縛された名前は、モジュールdjango.db.modelのグローバル変数であって、パッケージdjango.db.modelの属性名として使えます。


ちなみに

from django.db import models print(models.__file__)

とモジュールの__file__属性を確認するのがいいですよ。


(追記/余談)

**プロパティ**は属性の中でも相当特殊なもので、ずっと狭いものだけを指すので、この質問のタイトルとしては不適切かな、と思いました。

投稿2019/11/12 04:25

編集2019/11/12 04:30
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aae_11

2019/11/12 05:08

ご丁寧なご回答誠にありがとうございます。 「from django.db import models print(models.__file__)」 こちらなのですが、未だpythonの学習が浅く、こちらの部分簡易的に実行し確認するといったやり方が分かりません。可能でありましたら、教えて頂けないでしょうか。。。?
quickquip

2019/11/12 05:24

対話モードで models をしたと質問に書いてありますが、かわりに print(models.__file__) とするだけですよ。
aae_11

2019/11/12 08:10

ありがとうございます。ファイル名が表示できたのを確認できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問