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天了解脱拉。:.゚ヽ(*´∀`)ノ゚.:。!


<<:  第29天:英雄指南-6.从服务器端获取资料(1)

>>:  DAY25 深度学习-卷积神经网路-Yolo v3

Day#27 上传照片

前言 昨天因为对话的部分有bug...解不粗乃 呜呜呜想说那来先看看别的部分好了(?) downlo...

图的走访 - BFS 篇

4 图的走访 - BFS 篇 如果要好好地探索一张图,最经典的方法莫过於深度优先搜索(Depth F...

Day22:终於要进去新手村了-Javascript-函式-概念

这篇我会记录看教学影片所笔记的一些内容,用来帮助理解函式的一些观念。 函式是属於一种资料形式,所以可...

Day03:资料结构 - 列表(List)

什麽是资料结构? 前一天有提到空间复杂度(Space Complexity),简单的复习一下,空间复...

【Day28】2次收敛除法器实作

接下来探讨一种透过牛顿法来找到相除解的方法 收敛除法 Step1 : 规格化 N 和 D,令 D 趋...