「Django Unleashed筆記/第三章」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
行 53: 行 53:
       get_latest_by = ['founded_date'] # 取最後一個的取出依據
       get_latest_by = ['founded_date'] # 取最後一個的取出依據
       verbose_name_plural = "ponies" # 複數呈現法
       verbose_name_plural = "ponies" # 複數呈現法
</pre>
* 假設在表單呈現時,DisplayModel 通常被轉換為 display model。
* 假設在表單呈現時,DisplayModel 通常被轉換為 display model。
* Django 的處理方式:
* Django 的處理方式:
行 63: 行 65:
** migrations/0001_initial.py 等等是 migration 檔
** migrations/0001_initial.py 等等是 migration 檔
*** {{code|./manage.py sqlmigrate blog 0001}} # 產生對應的 sql 檔
*** {{code|./manage.py sqlmigrate blog 0001}} # 產生對應的 sql 檔
* {{code|./manage.py migrate}}
* {{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)}} #加入資料




</pre>
[[category:資訊]]
[[category:資訊]]

於 2022年9月25日 (日) 19:33 的修訂

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 #進入 shell
  • from 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 名稱」中。
  • 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) #加入資料