zoukankan      html  css  js  c++  java
  • python测试开发django-32.admin后台多对多关系ManyToManyField

    前言

    一本书可以有多个作者,一个作者也可以写多本书,这种关系就是本篇要说的多对多关系。
    这种场景在django里面数据库设计时候,需要用到ManyToManyField方法

    多对多表设计

    auther(作者)表里面放作者的基本信息,book(书本信息)表放书的相关信息,书里面book_auth(作者)关联auther表。

    # models.py
    from django.db import models
    
    # Create your models here.
    
    class Auther(models.Model):
        '''作者'''
        name = models.CharField(max_length=10, verbose_name="作者")
        mail = models.CharField(max_length=30, verbose_name="邮箱")
        city = models.CharField(max_length=10, verbose_name="城市")
        class Meta:
           verbose_name_plural = '作者'
    
        def __str__(self):
            return self.name
    
    class Book(models.Model):
        '''书籍详情'''
        book_name = models.CharField(max_length=50, verbose_name="书名")
        auth = models.ManyToManyField(Auther, verbose_name="作者")
        class Meta:
           verbose_name_plural = '书籍详情'
    
        def __str__(self):
            return self.book_name
    

    admin.py设置后台页面显示, 作者信息需遍历book的auth,然后用列表返回

    # admin.py
    from django.contrib import admin
    from hello import models
    
    
    # Register your models here.
    
    class ControlAuther(admin.ModelAdmin):
        # 显示的字段
        list_display = ["name", "city", "mail"]
    
    class ControlBook(admin.ModelAdmin):
        # 显示的字段
        list_display = ["book_name", "作者"]
    
        # 定义一个方法,遍历book的auth,然后用列表返回
        def 作者(self, obj):
            return [a.name for a in obj.auth.all()]
    
    admin.site.register(models.Auther, ControlAuther)
    admin.site.register(models.Book, ControlBook)
    

    表设计好之后执行下面两句

    makemigrations会在当前目录下生成一个migrations文件夹,该文件夹的内容就是数据库要执行的内容

    python manage.py makemigrations

    migrate就是执行之前生成的migrations文件,这一步才是操作数据库的一步

    python manage.py migrate

    admin后台页面

    打开admin后台管理页面添加几个作者信息

    再打开书籍信息页面,添加书名和作者,按住Ctrl键可以勾选多个作者

    数据库查看

    查看数据库会发现除了book表和auther表,还会多出一个book_auther表(自动生成的)

    book_auther表会自动记录对应关系

  • 相关阅读:
    html/css 滚动到元素位置,显示加载动画
    React 监听页面滚动,界面动态显示
    Html/css 列表项 区分列表首尾
    Html/css 水平布局居中
    Html 设置标题栏顶部固定
    TypeScript 引用资源文件后提示找不到的异常处理
    Github自动打包并推送Nuget版本
    获取电脑的网络连接状态(六)适配器状态 及 几种方案耗时对比
    获取电脑的网络连接状态(五)WebClient
    获取电脑的网络连接状态(四)IPHost
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10500819.html
Copyright © 2011-2022 走看看