前言

平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息。一般会建两张表,一张表放银行的信息,一张表放银行卡信息。

每个银行可以对应多个银行卡,每个银行卡只能是一家银行的。那么银行名称和银行卡就是一对多的关系,反之,银行卡和银行名称就是多对一的关系

一对多表设计

准备两张表,银行信息(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

最新文章

  1. 实现Div拖拽
  2. 时间戳 JavaScript parse() 方法 处理技巧
  3. 如何查找SAP的事务代码清单
  4. 转载 sql 存储过程与函数区别
  5. hdu 4007 暴力or线段树 ***
  6. Android Studio, gradle plugin is too old or set ANDROID_DAILY_OVERRIDE
  7. Upgrading to Java 8——第一章 Lambda表达式
  8. JAVA使用jdbc连接MYSQL简单示例
  9. win7中USB音箱没有声音解决的方法
  10. 如何从代码层防御10大安全威胁中的 Xpath Injection?
  11. java线程管理
  12. 最终有SpringMvc与Struts2的对照啦
  13. why TCP guarentee delivery?
  14. Netd学习笔记
  15. 控制结构(1) 分枝/叶子(branch/leaf)
  16. 使用CEF的JSON解析功能
  17. 类似fabric主机管理demo
  18. Android远程桌面助手之功能简介
  19. MySQL下载与安装
  20. linux 学习笔记 rpm命令

热门文章

  1. 几个比较实用的CSS
  2. Flask 目录
  3. Java @Override 注解
  4. JavaScript中的普通函数与构造函数
  5. 【LOJ】#2075. 「JSOI2016」位运算
  6. 启动spark集群
  7. 循序渐进学.Net Core Web Api开发系列【6】:配置文件appsettings.json
  8. html (第四本书第五章参考)
  9. iOS 11开发教程(十六)iOS11应用视图之删除空白视图
  10. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)