From 199d588abde44d6010a30d4fc8de349063eb55a1 Mon Sep 17 00:00:00 2001 From: Christine Shao-Fang Kao Date: Wed, 29 Aug 2018 23:07:50 +0800 Subject: [PATCH 1/3] update the ForeignKey field for Django 2.0 --- 07-django-models.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/07-django-models.md b/07-django-models.md index ada9f62..6481681 100644 --- a/07-django-models.md +++ b/07-django-models.md @@ -24,7 +24,7 @@ class Store(models.Model): class MenuItem(models.Model): - store = models.ForeignKey('Store', related_name='menu_items') + store = models.ForeignKey('Store', related_name='menu_items', on_delete=models.PROTECT) name = models.CharField(max_length=20) price = models.IntegerField() @@ -45,6 +45,8 @@ class MenuItem(models.Model): 在 `ForeignKey` 的狀況中,Django 預設會用 model 的名稱後面加 `_set` 來當作 reverse relation 的名稱,所以 `MenuItem.store` 的預設 reverse relation key 會是 `Store.menuitem_set`。你當然可以直接使用這個值,不過如果狀況允許,我個人推薦盡量還是手動設定這個值。即使設成和預設一樣,也比沒有設定好,因為 *explicit is better than implicit* 是 Python 的中心思想之一。 +`ForeignKey` 還有第三個 attribute `on_delete`。為了避免 `Store` 這個物件在操作過程中被刪掉,我們將值設為 `PROTECT`,其他值的選項可以參見[官方文件](https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete)。 + 我們另外在兩個 models 都各加上了一個 [`__str__`](https://docs.python.org/3/reference/datamodel.html#object.__str__) 函式。這是 Python 用來把物件轉換成 `str` 的 hook;因為做網站時,常常需要把東西變成字串,所以這會很方便。 現在程式已經可以認得這兩種 models 了。但如果要儲存它們,還需要在資料庫裡建立對應的 tables。確保資料庫與程式中的定義同步,是件很麻煩的工作;幸好,Django 提供了一個自動同步資料表的工具,可以協助我們完成這個工作。 From 3ba2eff5854f58871615d418e78991c2be7fc24f Mon Sep 17 00:00:00 2001 From: Christine Shao-Fang Kao Date: Thu, 30 Aug 2018 00:23:20 +0800 Subject: [PATCH 2/3] change PROTECT to SET_NULL for ForeignKey testing to pass --- 07-django-models.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/07-django-models.md b/07-django-models.md index 6481681..a85be9f 100644 --- a/07-django-models.md +++ b/07-django-models.md @@ -24,7 +24,7 @@ class Store(models.Model): class MenuItem(models.Model): - store = models.ForeignKey('Store', related_name='menu_items', on_delete=models.PROTECT) + store = models.ForeignKey('Store', related_name='menu_items', on_delete=models.) name = models.CharField(max_length=20) price = models.IntegerField() @@ -45,7 +45,7 @@ class MenuItem(models.Model): 在 `ForeignKey` 的狀況中,Django 預設會用 model 的名稱後面加 `_set` 來當作 reverse relation 的名稱,所以 `MenuItem.store` 的預設 reverse relation key 會是 `Store.menuitem_set`。你當然可以直接使用這個值,不過如果狀況允許,我個人推薦盡量還是手動設定這個值。即使設成和預設一樣,也比沒有設定好,因為 *explicit is better than implicit* 是 Python 的中心思想之一。 -`ForeignKey` 還有第三個 attribute `on_delete`。為了避免 `Store` 這個物件在操作過程中被刪掉,我們將值設為 `PROTECT`,其他值的選項可以參見[官方文件](https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete)。 +`ForeignKey` 還有第三個 attribute `on_delete`,其值的選項可以參見[官方文件](https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete)。 我們另外在兩個 models 都各加上了一個 [`__str__`](https://docs.python.org/3/reference/datamodel.html#object.__str__) 函式。這是 Python 用來把物件轉換成 `str` 的 hook;因為做網站時,常常需要把東西變成字串,所以這會很方便。 From 8eca9dfed2e532da53978dd22c969d7b6f9f4ba1 Mon Sep 17 00:00:00 2001 From: Christine Shao-Fang Kao Date: Thu, 30 Aug 2018 00:25:28 +0800 Subject: [PATCH 3/3] update on_delete value --- 07-django-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/07-django-models.md b/07-django-models.md index a85be9f..f777167 100644 --- a/07-django-models.md +++ b/07-django-models.md @@ -24,7 +24,7 @@ class Store(models.Model): class MenuItem(models.Model): - store = models.ForeignKey('Store', related_name='menu_items', on_delete=models.) + store = models.ForeignKey('Store', related_name='menu_items', on_delete=models.SET_NULL, null=True) name = models.CharField(max_length=20) price = models.IntegerField()