python测试开发django(30)--admin后台多对多关系ManyToManyField

前言

一本书可以有多个作者,一个作者也可以写多本书,这种关系就是本篇要说的多对多关系。

这种场景在django里面数据库设计时候,需要用到ManyToManyField方法

多对多表设计

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

# coding:utf-8
#models.py
from django.db import models

# Create your models here.
#新建一个Man类,继承自models.Model
class Authers(models.Model):
    names=models.CharField(max_length=10,verbose_name="作者")
    mails=models.CharField(max_length=30,verbose_name="邮箱")
    citys=models.CharField(max_length=10,verbose_name="城市")
    class Meta:
        verbose_name_plural='作者'
    def __str__(self):
        return self.names

class Book(models.Model):
    book_name=models.CharField(max_length=50,verbose_name="书名")
    auth=models.ManyToManyField(Authers,verbose_name="作者")
    class Meta:
        verbose_name_plural="书籍详情"
    def __str__(self):
        return self.book_name

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

# coding:utf-8
# #admin.py
from django.contrib import admin
from tb import models

admin.site.site_header="藏龙岛项目管理系统"
admin.site.site_title="登录后台系统"
admin.site.index_title='后台管理'
class ControlAuther(admin.ModelAdmin):
    #显示字段
    list_display=["names","citys","mails"]

class ControlBook(admin.ModelAdmin):
    #显示字段
    list_display=["book_name","auth"]
    #定义一个方法,遍历book的auth,然后用列表返回
    def auth(self,obj):
        return [a.name for a in obj.auth.all()]
admin.site.register(models.Authers,ControlAuther)
admin.site.register(models.Book,ControlBook)

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

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

python manage.py makemigrations

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

python manage.py migrate 

admin后台页面

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

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

 数据库查看

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

 book_auth表会自动记录对应关系

原文地址:https://www.cnblogs.com/canglongdao/p/14118055.html