iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 29
0
自我挑戰組

Cloud/SDN/SFC...菜鳥的學習筆記系列 第 29

DAY 29 Django 簡易入門教學(六)-建立資料庫與模型(Model)

Django 資料庫與模型(Model)

首先,先讓我們新創立一個餐廳的 app :

python manage.py startapp restaurants

創立完 app 後,別忘了把它加入 settings.py 內的 installed_apps 裡面:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
    'restaurants' #加入
]

接著,讓我們進入 restaurants 的資料夾內,建立一個名為 models.py 的檔案:

from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=20) #餐廳名稱
    phone_number = models.CharField(max_length=15) #餐廳電話
    address = models.CharField(max_length=50, blank=True)  #餐廳地址

class Food(models.Model):
    name = models.CharField(max_length=20) #食物名稱
    price=models.DecimalField(max_digits=3,decimal_places=0) #食物價錢
    is_spicy = models.BooleanField(default=False) #會不會辣
    food_restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) #由哪個餐廳製作

我們在此定義了該 model 所有的 class 的各個欄位型態,值得一題的是 ForeignKey 指的是多對一(many-to-one)的關係,它限制欄位值只能來自另一個資料表的主鍵欄位。而 on_delete=models.CASCADE 指的是當對應的類別被刪除後,這筆資料也跟著一倂刪除的意思。
(也就是說當製作該道食物的餐廳倒閉,這道食物自然也就吃不到了。)

之後,在準備建立資料檔時,可以先檢查自己的設計的model有沒有問題:

python manage.py check

接下來,建立 migration 記錄檔,確保資料表的架構和版本有被記錄下來:

python manage.py makemigrations restaurants

然後,正式將模型與資料庫同步:

python manage.py migrate restaurants 0001

0001是版本編號,使用了migrate指令,就能夠根據模型的更動,將現行的資料庫調整到與記錄檔一樣。若不指定編號,則自動更新到最新版本。

資料操作

新增資料

首先,進入 Django shell 中:

python manage.py shell

引入我們剛才建立的 models.py 當中的類別:

>>> from restaurants.models import Restaurant, Food

接著,建立第1筆模型資料並儲存:

>>> restaurant1=Restaurant(name='一號店', phone_number='01-1111111', address='一號路')
>>> restaurant1.save()

接著,當我們察看資料庫時,會發現多了一筆資料:

>>> Restaurant.objects.all()
<QuerySet [<Restaurant: Restaurant object (1)>]>

當然,也有另一種新增方法:

restaurant2=Restaurant.objects.create(name='二號店', phone_number='02-2222222', address='二號路')

objects 為管理器,擁有關於查詢該模型資料的各種方法,接下來我們都將用 objects 進行操作。

更新資料

如果想更新資料,可以用 filter 對資料過慮並搜尋,然後透過 update 更新:

Restaurant.objects.filter(address='一號路').update(address='一號巷')

接著,讓我們來看看更新後的資料:

>>> r1 = Restaurant.objects.get(name='一號店')
>>> r1.address
'一號巷'

刪除資料

刪除資料的方法:

Restaurant.objects.get(name='一號店').delete()

關聯

接下來,為了使資料更好分辨,讓我們修改一下 models.py :

from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=20) #餐廳名稱
    phone_number = models.CharField(max_length=15) #餐廳電話
    address = models.CharField(max_length=50, blank=True)  #餐廳地址

    def __str__(self): #新增
        return self.name

class Food(models.Model):
    name = models.CharField(max_length=20) #食物名稱
    price=models.DecimalField(max_digits=3,decimal_places=0) #食物價錢
    is_spicy = models.BooleanField(default=False) #會不會辣
    food_restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) #由哪個餐廳製作

    def __str__(self): #新增
        return self.name

接著用 exit() 離開,並利用 python manage.py shell 重新進入 shell 中。
此時我們就能發現因為__str__函式的緣故,顯示出來的資訊好看多了!

>>> from restaurants.models import Restaurant, Food
>>> Restaurant.objects.all()
<QuerySet [<Restaurant: 二號店>]>

緊接著,創建一些 food 的資料:

>>> r2 = Restaurant.objects.get(name='二號店')
>>> food = Food.objects.create(name='便當', price='60', is_spicy=False, food_restaurant=r2)
>>> food.food_restaurant.name
'二號店'

藉由上述的程式,可以發現我們能透過食物關聯到餐廳,並取得餐廳的名子。

今天的介紹就到這裡,明天就30天了解脫拉。:.゚ヽ(*´∀`)ノ゚.:。!


上一篇
DAY 28 Django 簡易入門教學(五)-建立模版
下一篇
DAY 30 Django 簡易入門教學(七)-Admin管理介面
系列文
Cloud/SDN/SFC...菜鳥的學習筆記30

尚未有邦友留言

立即登入留言