前言
一本書可以有多個作者,一個作者也可以寫多本書,這種關系就是本篇要說的多對多關系。
這種場景在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表會自動記錄對應關系