Django中ORM物件關係的對映
阿新 • • 發佈:2018-12-19
ORM
面向物件的的方式去操作資料庫的建立表以及增刪改查等操作
優點:ORM使得通用的資料庫變得更加的簡單,不用去考慮所謂的SQL語句。
通過在Django中建立表來進一步解釋(這裡用到的資料庫是MySQL)
因為我們用到的是MySQL所以必須連線的是MySQL的資料庫進行同步,在專案的__init__py檔案設定Django連線資料庫
import pymysql
pymysql.install_as_MySQLdb()
在settings中對DATABASES進行修改
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':"mysite", 'USER':"root", 'PASSWORD':"password", 'HOST':'192.168.182.182', 'PORT':'3306', } }
在連線資料庫之前需要做的是在settings裡的INSTALLED_APPS中加入“app名”,然後同步資料庫
INSTALLED_APPS = [
'app01.apps.App01Config',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
在models.py中進行建表:
from django.db import models<br> class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名稱") 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.URLField() class Meta: verbose_name = '出版商' verbose_name_plural = verbose_name def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),)) email = models.EmailField() address = models.CharField(max_length=50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2,default=10) def __str__(self): return self.title
最後進行資料的遷移需要在終端輸入以下兩行程式碼:
1.通過app檔案下的migrations目錄記錄,檢測models.py中的di程式碼是否發生變化。
>>>pyhton manage.py makemigrations
2.把ORM程式碼轉化成SQL語句去操作資料庫。
>>>python manage.py migrate
此時開啟mysql將會看到自己所建立的表。
以上用到了那麼多的引數不妨我們在這裡進行總結:
字串類:
- CharField:(表示比較短的字串要求必須有一個引數max_length=,資料庫層和Django層校驗欄位所允許的最大字串)
- TextField:(一個容量很大的文字欄位,用<textarea>表示該欄位資料)
- EmailField:(帶有檢查email合法性的欄位)
- ImageField:(驗證上傳物件是否會合法的照片,有兩個可選引數:height_field,width_field)
- FileField:(檔案上傳欄位,要求必須有引數:upload_to,一個儲存上載檔案的本地檔案路徑)
- URLField:(用於儲存URL)
- IPAddressField:(一個字串形式的IP地址)
- CommaSeparatedIntegerField:(用於存放逗號分隔符分開的整數,必須要有max_length)
時間段:
- DataTimeField:(日期時間欄位)
- DataField:(一個日期欄位,可選引數為:Argument 描述,auto_now物件被儲存時時間設定為當前時間)
數字欄位:
- IntegerField:(用於儲存一個整數)
- FloatField:(儲存一個浮點數,必須有兩個引數:max_digits:總位數,decimal_places:小數位數)
- AutoField:(一個IntegerField,新增記錄時會自動增長,一般不需要直接使用這個欄位,自定義一個主鍵必須要有的引數為:primary_key=Ture
列舉欄位:
choice = ( (1,'football'), (2,'basketball'), (3,'others')) ball = models.IntegerField(choices = choice)
模型之間的關係有三種:一對一,一對多,多對的。
一對一:就是主外來鍵的基礎上,給外來鍵加了一個UNIQUE=Ture的屬性
一對多:就是主鍵與外來鍵的關係
多對多:自動建立第三張表。