1. 程式人生 > >Django中ORM物件關係的對映

Django中ORM物件關係的對映

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的屬性

一對多:就是主鍵與外來鍵的關係

多對多:自動建立第三張表。