---
# System prepended metadata

title: 'Django 2.0 文章集 [4] 建立超級使用者'
tags: [python, Django, django2.0]

---

# Django 2.0 文章集 [4] 建立超級使用者

###### tags: `Django`, `django2.0`, `python`

##  建立超級使用者
e.g. "dada00321":"dada00321@gmail.com"
python manage.py createsuperuser
(鍵入上述指令後，一步步輸入即可建立 superuser)


##  進入管理後台
### 1) 運行 server
python manage.py runserver
python manage.py runserver 127.0.0.1:8001 --settings=mysite.settings

### 2) 瀏覽 "127.0.0.1:8001/admin/"


##  在管理後台添加模型
### => 編輯 blog/admin.py
### 加入下面 code:
```
from .models import Post
admin.site.register(Post)
```

### 存檔後 run server => 重新整理 browser
### 即可看到加入 Post 資料表後的管理後台


##  變更管理後台模型顯示方式
### => 編輯 blog/admin.py

### 刪除先前 code:
```
admin.site.register(Post)
```

### 加入下面 code:
```
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ("title", "slug", "author",
                    "publish", "status")
    list_filter = ("status", "author", "publish", "created")
    search_fields = ("title", "body")
    prepopulated_fields = {"slug": ("title",)}
    raw_id_fields = ("author",)
    date_hierarchy = "publish"
    ordering = ("status", "publish")
```


##  QuerySet-資料庫中存值
### save() 會執行 SQL語法 UPDATE
### 對實際資料庫的欄位值或記錄做更新

python manage.py shell
> from django.contrib.auth.models import User
> from blog.models import Post
> user = User.objects.get(username="dada00321")
> post = Post(title="Second post",
                slug="2nd-post",
                body="I'm the 2nd post!",
                author=user)
> post.save()


##  QuerySet-資料庫中取值
python manage.py shell
> from blog.models import Post
> Post.objects.all()

### (過濾:給定條件) 使用 filter() 過濾取值
> Post.objects.filter(publish__year=2021)
> Post.objects.filter(publish__month=1)
> Post.objects.filter(publish__day=29)

### (過濾:排除條件) 使用 exclude() 過濾取值
> Post.objects.filter(publish__month=1).exclude(title__startswith="爬蟲")

### (過濾:排序) 使用 order_by() 過濾取值
> Post.objects.order_by("title") # ASC
> Post.objects.order_by("-title") # DESC


## QuerySet-刪除資料表中的記錄 (以 Post 資料表為例)
### P.S. 當記錄被刪除，該記錄的父資料表(ForeignKey對象) 與該記錄的相依關係(dependency) 也會被一併刪除。
### (前提是 ForeignKey對象 有設置 on_delete=CASCADE)

> Post.objects.get(id=1) # 先印出確認一下
> post = Post.objects.get(id=1) # 確認要刪除該筆記錄，儲存至 post 變數
> post.delete() # 執行刪除方法


##  建立模型管理器(類別)
### => 編輯 blog/models.py

#### 加入下面 code 以定義模型管理器:
```
class PublishedManager(models.Manager): 
    def get_queryset(self): 
        return super(PublishedManager,self)\
                    .get_queryset()\
                    .filter(status='draft')
```


#### 再加入下面 code 以設置模型管理器:
```
class Post(models.Model):
    ...
    # 預設的模型管理器
    objects = models.Manager()
    # 自訂的模型管理器
    published = PublishedManager()
```

##  利用模型管理器取值
python manage.py shell
> from blog.models import Post
> Post.published\
        .filter(title__startswith="Second")
