django設置多對多關系的三種方法


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:用來區分同一個表的外鍵,方便之后用來反向查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM