前言

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

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

一对多表设计

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

python测试开发django-31.admin后台一对多操作ForeignKey的更多相关文章

  1. python测试开发django-34.xadmin管理后台

    前言 django自带的admin后台管理页面有点丑陋,于是网上的大神优化了一版后台管理xadmin,并且开源了,在github开源下载到源码. 注意环境搭配: django 2.1.2 xadmin ...

  2. python测试开发django-17.admin后台管理

    前言 通常一个网站开发,需要有个后台管理功能,比如用后台管理发布文章,添加用户之类的操作.django的admin后台管理主要可以实现以下功能 基于admin模块,可以实现类似数据库客户端的功能,对数 ...

  3. python测试开发django-19.admin后台自定义显示

    前言 django的admin后台默认显示的内容很少,只显示了表的相关信息,查看字段内容需点开详情才能查看,不是很直观. 在admin.py文件里面是可以自定义相关的展示内容的,也可以添加搜索框,快速 ...

  4. python测试开发django-18.admin后台中文版

    前言 django的admin后台页面默认是英文的,不喜欢英文的话,可以改下setting.py里面的语言设置,改成中文版的显示 语言设置 打开setting.py,找到以下内容 # Internat ...

  5. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  6. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  7. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  8. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  9. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

随机推荐

  1. 启动tomcat的时候爆出如下错误

    The JRE_HOME environment variable is not defined correctly This environment 解决办法: https://blog.csdn. ...

  2. Deep learnin简介

    从今天开始,准备入DL的大坑,希望自己能坚持下来. 网上有不少介绍: 深度学习的历             史:http://www.goldencui.org/2014/12/02/%E7%AE%8 ...

  3. java 捕获所有异常

    1.) 通过捕获异常类型的基类Exception就可以处理所有类型的异常.(事实上还有其它的基类,但Exception是同编程活动相关的基类) 2.)因为Exception是与编程有关的所有异常类的基 ...

  4. mongodb分页查询

    Limit与Skip方法 MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指 ...

  5. 2、Centos6 安装tomcat8.5.31

    1.下载 安装包 wget http://mirrors.aliyun.com/apache/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar. ...

  6. python强大的数据类型转换

    # 原始的二维表数据集 jsonObj=[] # 添加模拟的数据 for i in range(1001,1004): for j in range(1,34): jsonObj.append({&q ...

  7. linux convert mp3 to wav and opus to wav

    link :  https://www.cyberciti.biz/faq/convert-mp3-files-to-wav-files-in-linux/ Install mpg321 or mpg ...

  8. Ubuntu 18.04及Snap体验——让Linux入门更简单(转))

    https://www.linuxidc.com/Linux/2018-06/152993.htm 初次听说过Linux的时候,是大一计算机课时候老师介绍说除了Windows还有Linux.Unix操 ...

  9. BZOJ3252 攻略 [树链剖分]

    题目传送门 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1169  Solved: 554[Submit][Status][Discuss] ...

  10. Java8 Lambda 之 Collection Stream

    Lambda 之 Collection Stream Collection.stream() 测试实体类 class Demo { private Long id; private String na ...