django設置多對多關系的三種方法,如果對第三張表有增加字段的需求,可考慮后兩種。
django幫我們生成第三張表
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField('Book') # 不在Author表中生產字段,生產第三張表
自己創建第三張表
class AuthorBook(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
date = models.DateField()
自建的表和 ManyToManyField 聯合使用
使用參數through:將自建的表設置成ManyToManyField的第三張表
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField('Book',through='AuthorBook')
class AuthorBook(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
date = models.DateField()
特殊:自建表中有對同一個表多個外鍵的情況
使用參數through_fields:指定外鍵名,說明第三張表中只有這些外鍵
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField('Book',through='AuthorBook',through_fields=['author','book']
class AuthorBook(models.Model):
author = models.ForeignKey(Author,related_name='a' ,on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
tuijian = models.ForeignKey(Author,related_name='b',on_delete=models.CASCADE)
參數related_name:用來區分同一個表的外鍵,方便之后用來反向查詢