python測試開發django-31.admin后台一對多操作ForeignKey


前言

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

一對多表設計

准備兩張表,銀行信息(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM