zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    应用开发笔记|MYD-YA157-V2 BSP多种方式的快速更新
    【新品发布】米尔MYC-CZU5EV新品登场,预售开启!一触即发
    价值3499元的米尔百度大脑EdgeBoard边缘AI计算盒免费试用
    Arm Development Studio 2020.1-1 Linux 64Bit下载
    Arm Development Studio 2020.1-1 Windows 64Bit下载
    应用开发笔记 | 米尔科技MYD-YA157C-V2开发板WIFI&BT 模块的移植
    Shiro简介
    Redis学习系列文章目录
    ASP.NET Core框架学习系列文章目录
    docker 基本原理
  • 原文地址:https://www.cnblogs.com/mashuqi/p/11003972.html
Copyright © 2011-2022 走看看