Django学習2 MODELデータモデリング

6538 ワード

データモデリング:Mysqlを例に
1.DjangoのM(Model)T(Template)V(View)開発モデル:
M:データアクセス層、データに関するアクセス、正確性確認、データ間の論理、行為定義などすべてのトランザクションを処理する
T:表現層、表現に関する意思決定の処理:ページや他のタイプで表示する方法
V:アクセスモデルと適切なモデルを呼び出す関連ロジックを含むビジネスロジック層
DjangoのMVCに対する解釈では、ビューは、ユーザに表示されるデータを記述するために使用される.データがどのように見えるかではなく、どのようなデータを表示するかです.対照的に、Ruby on Railsおよびいくつかの同類のフレームワークは、コントローラがユーザーにどのデータを表示するかを決定することを提唱しているが、ビューはどのデータを表示するかではなく、どのデータを表示するかを決定するだけである.
2.データベースを構成し、settingsでデータベースを構成します.
settings.py codes:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test',    #the name of used database
            'USER': 'root',
            'PASSWORD': 'root',
            'HOST': '',    #'' means localhost(127.0.0.1)
            'PORT': '3306', #'' means default
        }
    }

3.コマンドラインを使用してリンクをチェックします.
>>>python manage.py shell
In [1]: from django.db import connection as conn
In [2]: cursor = conn.cursor()
In [3]: cursor
Out[3]: 

4.0 Appの初期化:
>>>python manage.py startapp books
books
│  admin.py
│  models.py
│  tests.py
│  views.py
│  __init__.py
│
└─migrations
        __init__.py

4.1実装モデル:pythonコードでAppロジックを記述する:
models.py codes:
    from django.db import models

    # Create your models here.
    class Publisher(models.Model):
        def __unicode__(self):
            return self.name
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.CharField(max_length=30)

    class Author(models.Model):
        def __unicode__(self):
            return first.name+' '+last_name
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=50)
        email = models.EmailField()

    class Book(models.Model):
        def __unicode__(self):
            return self.title
        title = models.CharField(max_length=1000)
        authors = models.ManyToManyField(Author)
        publishers = models.ForeignKey(Publisher)
        publication_date = models.DateField()

unicodeメソッドによるオブジェクトの文字列表示
4.2サイトへのAppの追加:
settings.py codes:
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'books',#     
    )

4.3 Appの変更/追加:
>>>python manage.py makemigrations polls
変更内容が表示されます
4.5進行中のNステップ挙動の表示N~[1999]
>>>python manage.py sqlmigrate books 0001
BEGIN;
CREATE TABLE `books_author` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `
first_name` varchar(30) NOT NULL, `last_name` varchar(50) NOT NULL, `email` varc
har(254) NOT NULL);
CREATE TABLE `books_book` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `ti
tle` varchar(1000) NOT NULL, `publication_date` date NOT NULL);
CREATE TABLE `books_book_authors` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY
KEY, `book_id` integer NOT NULL, `author_id` integer NOT NULL, UNIQUE (`book_id`
, `author_id`));
CREATE TABLE `books_publisher` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
, `name` varchar(30) NOT NULL, `address` varchar(50) NOT NULL, `city` varchar(60
) NOT NULL, `state_province` varchar(30) NOT NULL, `country` varchar(50) NOT NUL
L, `website` varchar(200) NOT NULL);
ALTER TABLE `books_book` ADD COLUMN `publishers_id` integer NOT NULL;
ALTER TABLE `books_book` ALTER COLUMN `publishers_id` DROP DEFAULT;
ALTER TABLE `books_book_authors` ADD CONSTRAINT `books_book_authors_book_id_30c6
61c_fk_books_book_id` FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`);
ALTER TABLE `books_book_authors` ADD CONSTRAINT `books_book_authors_author_id_40
7dfb10_fk_books_author_id` FOREIGN KEY (`author_id`) REFERENCES `books_author` (
`id`);
CREATE INDEX `books_book_authors_0a4572cc` ON `books_book_authors` (`book_id`);
CREATE INDEX `books_book_authors_4f331e2f` ON `books_book_authors` (`author_id`)
;
CREATE INDEX `books_book_3bcd2047` ON `books_book` (`publishers_id`);
ALTER TABLE `books_book` ADD CONSTRAINT `books_book_publishers_id_5fd67839_fk_bo
oks_publisher_id` FOREIGN KEY (`publishers_id`) REFERENCES `books_publisher` (`i
d`);

COMMIT;

4.6間違いがないか検査する:
>>>python manage.py check
System check identified no issues (0 silenced).

4.7修正を実施する:
>>>python manage.py migrate
pythonはmodelsの論理に基づいてデータベースにテーブルを作成し、各テーブルは自動的に増加したidプライマリ・キーを生成します.
5.shellを利用してmodelsを認識する:
>>>python manage.py shellがshellに入る
In [1]: from books.models import Publisher
In [2]: Publisher.objects.all()
Out[2]: []
In [5]: p = Publisher(name='Bpress',address='Other Address',city='b city',state_
province='CB',country='U.K')
In [6]: p
Out[6]: 
In [7]: Publisher.objects.all()
Out[7]: []
In [8]: p.save()
In [9]: Publisher.objects.all()
Out[9]: [, ]
In [10]: Publisher.objects.order_by("name")#-name    
Out[10]: [, ]
In [11]: p = Publisher.objects.get(name='Apress')
In [12]: p.delete()
In [13]: Publisher.objects.all()
Out[13]: []
In [15]: Publisher.objects.filter(pk=2)
Out[15]: []
In [20]: Publisher.objects.filter(name__contains='p')
Out[20]: []
In [21]: Publisher.objects.filter(name__startswith='B')
Out[21]: []
In [22]: Publisher.objects.count()
Out[22]: 1
In [27]: p = Publisher.objects.all()[0]
In [28]: p.pk
Out[28]: 2L
In [37]: Publisher.objects.all().delete()
In [38]: Publisher.objects.all()
Out[38]: []