一對多: 多的那方為子表, 設置外鍵
fk = models.ForeignKey( # django默認創建為 fk_id
to='主表名', # 可不加to
to_field='主表字段名', # 默認為主表的主鍵
on_delete='級聯方式', # models.CASCADE // 父表刪除,子表對應刪除
# models.SET_NULL // 父表刪除,子表對應置空,前提是允許置空(默認不允許置空)
# models.SET_DEFAULT // 父表刪除,子表對應置為默認值,前提是有默認值(default)
# models.PROTECT // 子表有數據,父表不允許刪除,否則報錯
related_name='反向操作的manager' # 用於代替反向操作的manager, obj.child_set
db_constraint = True # 是否創建約束
)
一對一: 一對多 + 唯一索引
oto = models.OneToOneField(
to = '主表名', # 可不加to
to_field = '主表字段名', # 默認為主表的主鍵
on_delete = '級聯方式',
)
多對多: 兩個一對多
1. 自動創建: 可用manager修改數據
mtm = models.ManyToManyField(
to = '主表名',
related_name= '反向操作的manager',
db_constraint = True, # 是否對第三張表創建約束
db_table = None, # 第三張表名
)
2. 手動創建: 手動修改數據
1>. 自定義第三表
class Table_name(models.Model):
u = models.ForeignKey(Table_1)
t = models.ForeignKey(Table_2)
2>. mtm = models.ManyToManyField(
to = '主表名',
related_name = '反向操作的manager',
through = '自定義的第三張表', # 用於指定關系表
through_fields= ['u','t'] # 用於指定關系表中那些字段做多對多關系表
)
自關聯:
1. 多對多:
class User:
d = models.ManyToManyField('self',related_name='b') # 用戶互粉
2. 一對多:
d = models.ForeignKey(User,related_name='b') # 評論樓