前言
平常的網頁上有很多一對多的場景,比如填寫銀行卡信息的時候,會從銀行列表下拉框選擇對應的銀行信息。一般會建兩張表,一張表放銀行的信息,一張表放銀行卡信息。
每個銀行可以對應多個銀行卡,每個銀行卡只能是一家銀行的。那么銀行名稱和銀行卡就是一對多的關系,反之,銀行卡和銀行名稱就是多對一的關系

一對多表設計
准備兩張表,銀行信息(Bank)和卡號信息(CardInfo)
ForeignKey(外鍵)里面有2個必傳參數,第一個參數(to)是關聯到對應的表(Bank),第二個參數的on_delete指的是通過ForeignKey連接起來的對象被刪除后,當前字段怎么變化。
常見的選項有:
- models.CASCADE,對象刪除后,包含ForeignKey的字段也會被刪除
- models.PROTECT,刪除時會引起ProtectedError
- models.SET_NULL,注意只有當當前字段設置null設置為True才有效,此情況會將ForeignKey字段設置為null
- models.SET_DEFAULT ,同樣,當前字段設置了default才有效,此情況會將ForeignKey 字段設置為default 值
- moels.SET,此時需要指定set的值
- models.DO_NOTHING ,什么也不做
# models.py
from django.db import models
# Create your models here.
class Bank(models.Model):
'''銀行信息'''
bank_name = models.CharField(max_length=50, verbose_name="銀行名稱")
city = models.CharField(max_length=30, verbose_name="城市")
point = models.CharField(max_length=60, verbose_name="網點")
class Meta:
verbose_name_plural = '銀行卡'
def __str__(self):
return self.bank_name
class CardInfo(models.Model):
'''卡信息'''
card_id = models.CharField(max_length=30, verbose_name="卡號")
card_name = models.CharField(max_length=10, verbose_name="姓名")
info = models.ForeignKey(Bank, on_delete=models.CASCADE, verbose_name="選擇銀行")
class Meta:
verbose_name_plural = '卡號信息'
def __str__(self):
return self.card_id
admin.py設置后台頁面顯示詳情
# admin.py
from django.contrib import admin
from hello import models
# Register your models here.
class ControlBank(admin.ModelAdmin):
# 顯示的字段
list_display = ["bank_name", "city", "point"]
class ControlCardInfo(admin.ModelAdmin):
# 顯示的字段
list_display = ["card_id", "card_name", "info"]
admin.site.register(models.Bank, ControlBank)
admin.site.register(models.CardInfo, ControlCardInfo)
表設計好之后執行下面兩句
makemigrations會在當前目錄下生成一個migrations文件夾,該文件夾的內容就是數據庫要執行的內容
python manage.py makemigrations
migrate就是執行之前生成的migrations文件,這一步才是操作數據庫的一步
python manage.py migrate
admin后台頁面
打開后台管理,進入Bank(銀行卡)編輯界面,新增幾個銀行卡信息

再打開Card info(卡號信息),新增銀行卡號信息,選擇銀行卡,只能是單選了,會自動關聯前面添加的銀行名稱

新增成功后查看對應數據庫里面數據


cardinfo表里面有個info_id字段會自動關聯到bank表里面的id
