python測試開發django-33.admin後臺一對一關係OneToOneField

前言

假若有一張表(Card)記錄用戶的卡號信息和用戶名,如今須要新增一個小功能,記錄用戶的手機號,郵箱和住址等更多信息。
爲了避免影響原來的表設計,能夠新增一張表(CardDetail),專門記錄用戶的其它更多信息。
銀行帳戶(Card)和聯繫方式(CardDetail),一個銀行帳戶對應一個聯繫人,而一個聯繫人也只對應一個帳戶,這就是一對一關係。python

一對一表設計

在models.py建立數據模型, Card表記錄卡號、姓名、添加時間基本的信息,CardDetail使用OneToOneField關聯Card表,記錄電話、郵箱、城市、詳細地址。
OneToOneField裏面有兩個參數必填,第一個參數傳關聯的表名稱,第二個參數on_delete=models.CASCADE(對象刪除後,包含OneToOneField的字段也會被刪除)數據庫

# models.py

from django.db import models

# Create your models here.


class Card(models.Model):
    '''銀行卡 基本信息'''
    card_id = models.CharField(max_length=30, verbose_name="卡號", default="")
    card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
    add_time = models.DateField(auto_now=True, verbose_name="添加時間")
    class Meta:
        verbose_name_plural = '銀行卡帳戶'
        verbose_name = "銀行卡帳戶_基本信息"
    def __str__(self):
        return self.card_id

class CardDetail(models.Model):
    '''銀行卡 詳情信息'''
    card = models.OneToOneField(Card,
                               on_delete=models.CASCADE,
                               verbose_name="卡號"
                                )
    tel = models.CharField(max_length=30, verbose_name="電話", default="")
    mail = models.CharField(max_length=30, verbose_name="郵箱", default="")
    city = models.CharField(max_length=10, verbose_name="城市", default="")
    address = models.CharField(max_length=30, verbose_name="詳細地址", default="")

    class Meta:
        verbose_name_plural = '我的資料'
        verbose_name = "帳戶_我的資料"

    def __str__(self):
        return self.card.card_user

admin.py設置後臺頁面顯示詳情django

# admin.py
from django.contrib import admin
from hello import models


# Register your models here.

class MoreInfo(admin.StackedInline):
    model = models.CardDetail

@admin.register(models.Card)
class ControlCard(admin.ModelAdmin):
    list_display = ["card_id", "card_user", "add_time"]
    
    # 在Card頁面顯示更多信息CardDetail
    inlines = [MoreInfo]

表設計好以後執行下面兩句設計

makemigrations會在當前目錄下生成一個migrations文件夾,該文件夾的內容就是數據庫要執行的內容code

python manage.py makemigrations對象

migrate就是執行以前生成的migrations文件,這一步纔是操做數據庫的一步blog

python manage.py migrate繼承

inlines關聯顯示

爲了讓 CardDetail 裏面信息和Card的信息在一個頁面上展現,這裏需用到 inlines 參數,關聯過去。
先寫一個MoreInfo類,繼承了admin.StackedInline,StackedInline是讓關聯的字段縱向顯示,多說無益,直接看效果。ci

列表頁面it

編輯頁面

StackedInline和TabularInline

StackedInline是縱向顯示,顯示效果如上面圖,TabularInline是橫線顯示,顯示效果以下圖

# amdin.py

# StackedInline改爲StackedInline
class MoreInfo(admin.StackedInline): 
    model = models.CardDetail

@admin.register(models.Card)
class ControlCard(admin.ModelAdmin):
    list_display = ["card_id", "card_user", "add_time"]

    # 在Card頁面顯示更多信息CardDetail
    inlines = [MoreInfo]

相關文章
相關標籤/搜索