多對多關聯關係的三種方式
阿新 • • 發佈:2021-12-01
全自動:利用orm自動幫我們建立第三張關係表
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
"""
優點:程式碼不需要你寫 非常的方便 還支援orm提供操作第三張關係表的方法...
不足之處:第三張關係表的擴充套件性極差(沒有辦法額外新增欄位...)
"""
純手動
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
'''
優點:第三張表完全取決於你自己進行額外的擴充套件
不足之處:需要寫的程式碼較多,不能夠再使用orm提供的簡單的方法
不建議你用該方式
'''
半自動
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through='Book2Author',
through_fields=('book','author')
)
class Author(models.Model):
name = models.CharField(max_length=32)
# books = models.ManyToManyField(to='Book',
# through='Book2Author',
# through_fields=('author','book')
# ) #可以寫在BOOK表或者Author表中,,注意to=哪個表,through_fields裡面欄位的順序(在哪個表中,哪個順序就在前面)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
"""
through_fields欄位先後順序
判斷的本質:
通過第三張表查詢對應的表 需要用到哪個欄位就把哪個欄位放前面
你也可以簡化判斷
當前表是誰 就把對應的關聯欄位放前面
半自動:可以使用orm的正反向查詢 但是沒法使用add,set,remove,clear這四個方法