「Django Unleashed筆記/第三章」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) (建立內容為「{{Nav|程式語言、邏輯學|Django Unleashed筆記}} ; Django Model 和 SQLite 資料庫 * MVC 理論 * 自動生成 SQLite 的資料 * 關聯式資料庫 * p…」的新頁面) |
Tankianting(討論 | 貢獻) |
||
(未顯示同一使用者於中間所作的 2 次修訂) | |||
行 9: | 行 9: | ||
* Entity 是表格 (table)。 | * Entity 是表格 (table)。 | ||
* pk = primary key:主鍵 | |||
* foreign key:外鍵 | |||
* unique identifier:單一識別子 | |||
* Django 中,我們只需要關注抽像關係和模型 | |||
* slug:儲存資料的字串 (unique) eg. "The quick brown fox" -> "the-quick-brown-fox" | |||
** 用 slug 比較好 | |||
** 不應該區分大小寫 | |||
** 不是 identifier 的全部 | |||
* 使用 model | |||
** myblog/organizer/model.py | |||
<pre> | |||
from django.db import models | |||
# Create your models here. | |||
class Post(models.Model): | |||
# varchar | |||
title = models.CharField(max_length=63, #最大文字數 | |||
unique = true, #是否唯一 | |||
help_text = 'help of title of the document', | |||
verbose_name = "post's title" # 複雜文字 | |||
) | |||
# 參數 db_index:被自動索引 | |||
slug = models.SlugField(max_length=100, | |||
unique_for_month='pub_date') # unique_for_month | |||
# 指確保同一月份不會強碰 | |||
text = models.TextField() # text | |||
pub_date = Models.DateField() # date | |||
startup = models.ForeignKey(Startup) # foreign key | |||
tags = models.ManyToManyField(Tag) # many-to-many relationship 多對多關係,建議放在持有attribute的欄位 | |||
# 其他還有 URLField, Emailfield 等 | |||
</pre> | |||
* <code>ManyToManyField(related_name = 'blog_posts')</code> # 使 startups 反向存取blog.posts | |||
<pre> | |||
class Tags(Models.model): | |||
class Meta: | |||
ordering=['name'] #以name 遞增排序,['-name'] 表示遞減排序 | |||
get_latest_by = ['founded_date'] # 取最後一個的取出依據 | |||
verbose_name_plural = "ponies" # 複數呈現法 | |||
</pre> | |||
* 假設在表單呈現時,DisplayModel 通常被轉換為 display model。 | |||
* Django 的處理方式: | |||
** 檢查 model -> 產生 migration file -> 產生 database | |||
** 適宜多人分工 | |||
* {{code|./manage.py check}} # 檢查模型 | |||
* {{code|./manage.py makemigrations organizer}} # 生成 migration 檔 | |||
** {{code|./manage.py makemigrations organizer}} | |||
** migrations/0001_initial.py 等等是 migration 檔 | |||
*** {{code|./manage.py sqlmigrate blog 0001}} # 產生對應的 sql 檔 | |||
* {{code|./manage.py migrate}} # migrate | |||
: ORM 操作 | |||
* {{code|./manage.py shell}} #進入 shell | |||
* {{code|from myblog.models import Tag, ...}} # 匯入 class(表格) | |||
* {{code|<nowiki>example = Tag('name='Education', slug='education')</nowiki>}} # 建立新列(資料) | |||
* {{code|example.save()}} # 儲存列 | |||
* {{code|example.delete()}} # 刪除列 | |||
:: manager:通常為 Tag.objects這樣的形式,型別為{{code|django.db.models.manager.Manager}},綁在Tag 等「class 名稱」中。 | |||
* {{code|<nowiki>Tag.objects.create(name='xxx', slug='yyy')</nowiki>}} # 創建新物件 | |||
* {{code|<nowiki>Tag.objects.bulk_create([Tag(name='xxx', slug='yyy'), Tag(name='zzz', slug='aaa')])</nowiki>}} #創建多個物件 | |||
* {{code|Tag.objects.all()}}#顯示列表 | |||
*{{code|Tag.objects.count()}}#顯示總數 | |||
*{{code|<nowiki>Tag.objects.get(slug='xxx')</nowiki>}}#得到特定條件的資料 | |||
*{{code|<nowiki>Tag.objects.get(slug__iexact='xxx')</nowiki>}}#得到特定條件的資料,大小寫不區分 | |||
*{{code|<nowiki>Tag.objects.get(slug__istartswith='xxx')</nowiki>}}#以xxx開頭的資料 | |||
*{{code|<nowiki>Tag.objects.get(slug__contains='xxx')</nowiki>}}#包含xxx的資料 | |||
*{{code|Tag.objects.get}}最多只能得到1個資料,多個資料要用{{code|<nowiki>Tag.objects.filter(slug__contains='yyy')</nowiki>}} | |||
*{{code|<nowiki>Tag.objects.filter(slug__contains='yyy').order_by('-name')</nowiki>}} #排序 | |||
*{{code|<nowiki>Tag.objects.values_list()</nowiki>}} #產出[(3, 'xxx', 'yyy'),...]的各物件列表 | |||
*{{code|<nowiki>Tag.objects.values_list('name', 'slug')</nowiki>}} #產出[('xxx', 'yyy'),...]的各物件列表,指定屬性 | |||
*{{code|<nowiki>Tag.objects.values_list('name', flat=True)</nowiki>}} #產出字串的queryset | |||
*記得保存新生的row | |||
*{{code|djt.tags.add(data)}} #加入資料 | |||
==關聯條目== | |||
{{特殊:字首索引/Django Unleashed筆記}} | |||
[[category:資訊]] | [[category:資訊]] |
於 2022年11月10日 (四) 23:13 的最新修訂
- Django Model 和 SQLite 資料庫
- MVC 理論
- 自動生成 SQLite 的資料
- 關聯式資料庫
- persistency -> 狀態的資料和無狀態的程式
- Ch 30 講到 PostgreSQL
- Entity 是表格 (table)。
- pk = primary key:主鍵
- foreign key:外鍵
- unique identifier:單一識別子
- Django 中,我們只需要關注抽像關係和模型
- slug:儲存資料的字串 (unique) eg. "The quick brown fox" -> "the-quick-brown-fox"
- 用 slug 比較好
- 不應該區分大小寫
- 不是 identifier 的全部
- 使用 model
- myblog/organizer/model.py
from django.db import models # Create your models here. class Post(models.Model): # varchar title = models.CharField(max_length=63, #最大文字數 unique = true, #是否唯一 help_text = 'help of title of the document', verbose_name = "post's title" # 複雜文字 ) # 參數 db_index:被自動索引 slug = models.SlugField(max_length=100, unique_for_month='pub_date') # unique_for_month # 指確保同一月份不會強碰 text = models.TextField() # text pub_date = Models.DateField() # date startup = models.ForeignKey(Startup) # foreign key tags = models.ManyToManyField(Tag) # many-to-many relationship 多對多關係,建議放在持有attribute的欄位 # 其他還有 URLField, Emailfield 等
ManyToManyField(related_name = 'blog_posts')
# 使 startups 反向存取blog.posts
class Tags(Models.model): class Meta: ordering=['name'] #以name 遞增排序,['-name'] 表示遞減排序 get_latest_by = ['founded_date'] # 取最後一個的取出依據 verbose_name_plural = "ponies" # 複數呈現法
- 假設在表單呈現時,DisplayModel 通常被轉換為 display model。
- Django 的處理方式:
- 檢查 model -> 產生 migration file -> 產生 database
- 適宜多人分工
./manage.py check
# 檢查模型./manage.py makemigrations organizer
# 生成 migration 檔./manage.py makemigrations organizer
- migrations/0001_initial.py 等等是 migration 檔
./manage.py sqlmigrate blog 0001
# 產生對應的 sql 檔
./manage.py migrate
# migrate
- ORM 操作
./manage.py shell
#進入 shellfrom myblog.models import Tag, ...
# 匯入 class(表格)example = Tag('name='Education', slug='education')
# 建立新列(資料)example.save()
# 儲存列example.delete()
# 刪除列
- manager:通常為 Tag.objects這樣的形式,型別為
django.db.models.manager.Manager
,綁在Tag 等「class 名稱」中。
- manager:通常為 Tag.objects這樣的形式,型別為
Tag.objects.create(name='xxx', slug='yyy')
# 創建新物件Tag.objects.bulk_create([Tag(name='xxx', slug='yyy'), Tag(name='zzz', slug='aaa')])
#創建多個物件Tag.objects.all()
#顯示列表Tag.objects.count()
#顯示總數Tag.objects.get(slug='xxx')
#得到特定條件的資料Tag.objects.get(slug__iexact='xxx')
#得到特定條件的資料,大小寫不區分Tag.objects.get(slug__istartswith='xxx')
#以xxx開頭的資料Tag.objects.get(slug__contains='xxx')
#包含xxx的資料Tag.objects.get
最多只能得到1個資料,多個資料要用Tag.objects.filter(slug__contains='yyy')
Tag.objects.filter(slug__contains='yyy').order_by('-name')
#排序Tag.objects.values_list()
#產出[(3, 'xxx', 'yyy'),...]的各物件列表Tag.objects.values_list('name', 'slug')
#產出[('xxx', 'yyy'),...]的各物件列表,指定屬性Tag.objects.values_list('name', flat=True)
#產出字串的queryset- 記得保存新生的row
djt.tags.add(data)
#加入資料