Django从理论到实战(part26)--ORM模型
學習筆記,僅供參考
參考自:Django打造大型企業(yè)官網(wǎng)–Huang Y;
本系列Blog以應用為主,理論基礎部分我在后端專欄的Django系列博客已經(jīng)寫過了,如果有些需要補充的知識點,我會在這個系列中,盡量詳細的記錄一下。
ORM模型
ORM模型介紹
ORM,全稱Object Relational Mapping,中文叫做對象關系映射,通過ORM我們可以通過類的方式去操作數(shù)據(jù)庫,而不用再寫原生的SQL語句。通過把表映射成類,把行作實例,把字段作為屬性,ORM在執(zhí)行對象操作的時候,最終還是會把對應的操作轉(zhuǎn)換為數(shù)據(jù)庫原生sql語句。
創(chuàng)建ORM模型
ORM模型一般放在app的models.py文件中,每個app都可以擁有自己的模型,并且如果這個模型想要映射到數(shù)據(jù)庫中,那么這個app必須要在settings.py的INSTALLED_APP中進行安裝,下面是一個書籍ORM模型:
from django.db import models class Book(models.Model):name = models.CharField(max_length=20,null=False)author = models.CharField(max_length=20,null=False)pub_time = models.DateTimeField(default=datetime.now)price = models.FloatField(default=0)上面這個模型繼承自django.db.models.Model類,如果這個模型想要映射到數(shù)據(jù)庫中,就必須繼承自這個類。
當這個模型映射到數(shù)據(jù)庫中時,表名是模型名稱的小寫形式(book),在這個表中,有四個字段,一個為name,該字段保存書的名稱,是varchar類型,最長不能超過20個字符,并且不能為空;第二個字段為作者姓名,同樣也是varchar類型,長度不能超過20個;第三個為出版時間,是datetime類型,默認是保存這本書籍的時間;第五個字段是這本書的價格,為浮點類型。
還有一個字段為主鍵id,在django中,如果一個模型沒有定義主鍵,那么將會自動生成一個自動增長的int類型的主鍵,并且這個主鍵的名字就叫做id。
映射模型到數(shù)據(jù)庫中
下面我們用案例,學習一下這個知識點。
- 創(chuàng)建數(shù)據(jù)庫
- 創(chuàng)建新項目
- 創(chuàng)建新的應用
- 在settings.py中,配置DATABASES和INSTALLED_APPS
- 在app的models.py中定義模型,該模型必須繼承自django.db.models
- 遷移
在cmd終端內(nèi),進入到項目所在的路徑,執(zhí)行命令python manage.py makemigrations,生成遷移腳本文件:
python manage.py makemigrations #輸出 Migrations for 'bookstore':bookstore\migrations\0001_initial.py- Create model Book在執(zhí)行完上述代碼后,Django為我們生成了一個遷移腳本0001_initial.py,我們?nèi)タ纯蠢锩娑加猩?#xff1a;
from django.db import migrations, modelsclass Migration(migrations.Migration):initial = Truedependencies = []operations = [migrations.CreateModel(name='Book',fields=[('bookid', models.AutoField(primary_key=True, serialize=False)),('name', models.CharField(max_length=20)),('author', models.CharField(max_length=20)),('price', models.FloatField(default=0)),],),]之后,當我們調(diào)用python manage.py migrate時,Django就會根據(jù)遷移腳本中的這些代碼,映射到數(shù)據(jù)庫中。
執(zhí)行命令python manage.py migrate,將遷移腳本文件映射到數(shù)據(jù)庫中:
python manage.py migrate #輸出 Operations to perform:Apply all migrations: admin, auth, bookstore, contenttypes, sessions Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying bookstore.0001_initial... OKApplying sessions.0001_initial... OK我們看到Django幫我們生成了許多數(shù)據(jù)表,這是由于Django存在很多內(nèi)置的應用,它們內(nèi)部也有models.py模型文件,當我們第一次進行遷移時,Django就會生成與這些模型對應的數(shù)據(jù)表。
現(xiàn)在,我們查看mynewbook數(shù)據(jù)庫中的數(shù)據(jù)表:
mysql> use mynewbook; Database changed mysql> show tables; +----------------------------+ | Tables_in_mynewbook | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | bookstore_book | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ 11 rows in set (0.00 sec)再查看一下 bookstore_book表的描述信息:
mysql> desc bookstore_book; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | bookid | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | author | varchar(20) | NO | | NULL | | | price | double | NO | | NULL | | +--------+-------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)可以看到,這和我們在models.py中設定的完全相同。
總結(jié)
以上是生活随笔為你收集整理的Django从理论到实战(part26)--ORM模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。