表结构设计

多对多关系表创建外键,典型例子:书--作者--出版社,书与作者的关系就可以看作是多对多关系。

 # 表结构设计
 class Book(models.Model):
    title = models.CharField(max_length=32)
    pub = models.ForeignKey('Publisher', on_delete=models.CASCADE) #与出版社之间建立多对一外键
 ​
 class Author(models.Model):
    name = models.CharField(max_length=32)
    books = models.ManyToManyField('Book')  # 描述多对多的关系  不生成字段  生成关系表

数据迁移

如果是在新的app中进行功能的设计,可以使用 python manage.py makemigrations app(应用名) 进行数据的迁移,数据迁移完之后会生成三张表,这是情理之中的事,因为多对多关系的两张表要建立连接的时,需要借助第三张表来维护二者的关系,这里会自动生成第三张表,如图:

Django-ORM之ManyToManyField的使用-多对多关系

Django-ORM之ManyToManyField的使用-多对多关系

【新建测试表结构】

 1 from django.db import models
 2  3  # Create your models here.
 4  class Publisher(models.Model):
 5     name = models.CharField(max_length=32)
 6     city = models.CharField(max_length=32)
 7  8     def __str__(self):
 9         return "<Publisher object: {} {}>".format(self.id, self.name)
10 11  class Author(models.Model):
12     name = models.CharField(max_length=32)
13     age = models.IntegerField()
14     phone = models.CharField(max_length=11)
15 16     def __str__(self):
17         return "<Author object: {} {}>".format(self.id, self.name)
18 19  class Book(models.Model):
20     title = models.CharField(max_length=32)
21     publish_date = models.DateField(auto_now_add=True)
22     price = models.DecimalField(max_digits=5, decimal_places=2)
23     memo = models.TextField(null=True)
24     # 创建外键,关联publish
25     publisher = models.ForeignKey(to="Publisher",null=True, on_delete=models.CASCADE)
26     # 创建多对多关联author
27     author = models.ManyToManyField(to="Author")
28 29     def __str__(self):
30         return "<Book object: {} {} {} {}>".format(self.id, self.title,self.price,self.author)

新建表结构