python+Django框架運用(四)

Django後臺管理

基本配置

默認登陸地址:http://127.0.0.1:8000/adminpython

建立後臺管理員:數據庫

  python3  ./manage.py  createsuperuser    # 回車後輸入如下內容django

  Username:輸入用戶名spa

  Email Address:電子郵箱code

  Password:密碼
  Password(again):重複密碼對象

 

基本管理

一、在應用中的admin.py中註冊要管理的實體類(models.py中的類)blog

from django.contrib import admin
from .models import *

# 註冊CartInfo和Order兩個實體類
admin.site.register(CartInfo)
admin.site.register(Order)

 

二、修改models.py,來改變後臺內容的顯示排序

  1). models.py中爲各個類(實體類)追加一個方法。繼承

def __str__(self):
    return self.屬性名

  2). 經過Models類的內部類Meta定義每一個類的展示形式get

class Author(models.Model):
  ... ...# 定義對象在後臺的展示形式
    def __str__(self):
        return self.names

    # 聲明內部類,定義當前類在管理頁面中的展示形式
    class Meta:
        # 1.修改當前表名爲author(須要同步到數據庫)
        db_table = 'author'

        # 下面兩個只與後臺有關係
        # 2.修改實體類在後臺管理頁中的名稱(單數)
        verbose_name = '做者'
        # 3.修改實體類在後臺管理頁中的名稱(複數)
        verbose_name_plural = verbose_name

        # 4.先按照年齡降序排序,再按照ID升序排序
        ordering = ['-age', 'id']

高級管理

一、在admin.py中建立高級管理類並註冊

# 定義Author高級管理類
# 類名:實體類名+Admin,必須繼承admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
    pass


# 註冊高級管理類
admin.site.register(Author, AuthorAdmin)

二、定製高級管理信息

# 定義Author高級管理類
class AuthorAdmin(admin.ModelAdmin):
    #  list_display:指定在列表頁中可以顯示的字段
    #  取值:由屬性名稱組成的元組或列表
    list_display = ['names', 'age', 'email']

    #  list_display_links:定義列表頁中能連接到詳情頁的字段
    #  取值:由屬性名稱組成的元組或列表(必須存在與list_display中)
    list_display_links = ['names', 'email']

    # list_editable:指定在列表頁中容許被編輯的字段
    # 取值:由屬性名稱組成的元組或列表
    # 不能出如今list_display_links, 可是必須在list_display中
    list_editable = ['age']

    # search_fields:添加容許被搜索的字段
    # 取值:由屬性名稱組成的元組或列表
    search_fields = ['names', 'email']

    # list_filter:在列表的右側增長過濾器,實現快速篩選
    list_filter = ['names', 'email']

    # fields:指定詳情頁顯示的字段以及排列的順序
    # 取值:由屬性名稱組成的元組或列表
    fields = ['email', 'names', 'age', 'isActive']
    
    # date_hierarchy:在列表頁的頂端增長一個時間選擇器
    # 取值必須是DateField或DateTimeField的值
    date_hierarchy = 'publicate'

    # fieldsets:在詳情頁中,對字段進行分組顯示(不能同時與fields存在)
    fieldsets = [
        # 分組1
        (
            '基本信息', {
                'fields': ('names', 'email')
            }
        ),
        # 分組2
        (
            '可選信息', {
                'fields': ('age', 'isActive'),
                'classes': ('collapse',),
            }
        )
    ]

 

關係映射

一對一映射

  一對一表示,A表中的一條記錄只能與B表中的一條記錄相關聯。

  數據庫中實現方式:

    A表:設置主鍵  

    B表:增長一列(字段),並引用自A表的主鍵,而且得增長惟一約束

  一、在Django中的實現方式:

    在要相關聯的兩個實體類中的任意一箇中增長:

    屬性(字段)名 =  models.OneToOneField(要關聯的實體類名)

  二、關聯查詢

# 在Wife類中新增一個字段一對一關聯Author類
class Wife(models.Model):
    ... 
    author=models.OneToOneField(Author)
# 正向查詢:經過wife 找 author
# 1.獲取 id 爲1 的 Wife的信息
wife = Wife.objects.get(id=1)
# 2.經過 Wife 的關聯屬性 author 來找Author
author = wife.author



# 反向查詢:經過author 找 wife
# 1.獲取 id 爲14 的 Author的信息
author = Author.objects.get(id=14)
# 2.經過 author 的關聯屬性 wife 來找wife
# wife是Django經過OneToOneField在Author(被關聯表)中默認增長的一個隱式屬性 wife = author.wife

 

一對多映射

  一對多表示,A表中的一條記錄能與B表中的多條記錄相關聯。反之,B表中的一條記錄只能與B表中的一條記錄相關聯。

  數據庫中實現方式:

    經過外鍵來實現一對多,在‘’表中增長外鍵對‘’表的主鍵進行引用

  一、在Django中的實現:

    在「多」的實體類中增長:

    屬性(字段)名 = models.ForeignKey("一"的實體類名)

  二、關聯查詢

# Book(多) 和 Publisher(一)
class Book(models.Model):
    ... ...
    publisher=models.ForeignKey(Publisher)
# 正向查詢 - 經過Book查詢Publisher    
# 查詢id爲1的書籍的信息
book = Book.objects.get(id=1)
# 查詢關聯的publisher
publisher = book.publisher
    
        

# 反向查詢 - 經過Publisher查詢Book
# Django會在 「一」 的實體中增長關聯對象_set 屬性,用於查詢「多」的數據
# 結合 Publisher 和 Book 之間關係 :在 Publisher 中 增長了一個 book_set 屬性
publisher=Publisher.objects.get(id=1)
books = publisher.book_set.all()

 

多對多關聯

  多對多表示,A表中的一條記錄能與B表中的多條記錄相關聯。反之,B表中的一條記錄一樣能與B表中的多條記錄相關聯。

  在數據庫中的實現方式:

    必選建立第三張表,關聯兩張多對多的數據表

  一、在Django中實現方式:

    在任意一個要實現多對多關聯的實體類中增長:

    屬性(字段)名 = models.ManyToManyField(關聯的實體類名)

  二、關聯查詢

# 實體類Author 與 Book多對多關聯
class Author(models.Model):
    ... ...
    book = models.ManyToManyField(Book)
# 正向查詢-經過Author查詢全部的Book
author = Author.objects.get(id=1)
# 經過 關聯屬性.all() 查詢全部對應數據
books = author.book.all()



# 反向查詢-經過Book查詢全部的Author
# Django中 會在Book(被關聯) 實體中增長一個隱式屬性author_set
book = Book.objects.get(id=1)
authors = book.author_set.all()

 

對於關聯映射的總結:

  三種關聯關係的查詢中,都存在正向和反向兩種查詢方式

  正向查詢都是直接用增長的關聯屬性進行查詢就能夠

  反向查詢在Django中都會增長一個隱式屬性,分別是:

    一對一:關聯的實體類名(小寫)

    一對多:在「一」的實體增長關聯屬性「_set」屬性,用於查詢"多"的數據

    多對多:與一對多相似。

 

未完待續......

相關文章
相關標籤/搜索