一、外鍵的刪除
關於
on_delete
的總結
-
1、常見的使用方式(設置為
null
)class BookModel(models.Model): """ 書籍表 """ book_name = models.CharField(max_length=100, verbose_name='書名') # 表示外鍵關聯到作者表,當作者表刪除了該條數據,圖書表中不刪除,僅僅是把外鍵置空 author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL) price = models.FloatField(verbose_name='價格') create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加時間')
-
2、關於別的屬性的介紹
CASCADE
:這就是默認的選項,級聯刪除,你無需顯性指定它。PROTECT
: 保護模式,如果采用該選項,刪除的時候,會拋出ProtectedError
錯誤。SET_NULL
: 置空模式,刪除的時候,外鍵字段被設置為空,前提就是blank=True, null=True
,定義該字段的時候,允許為空。SET_DEFAULT
: 置默認值,刪除的時候,外鍵字段設置為默認值,所以定義外鍵的時候注意加上一個默認值。SET()
: 自定義一個值,該值當然只能是對應的實體了
-
3、補充說明:關於
SET()
的使用**官方案例** def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), )
ManyToMany參數(through,db_constraint)
through : 指定自己寫好的第三張表,我們可以給第三張表添加字段了(告訴Django不用建第三張表了,我們都給他配好了)
class Book(models.Model): name=models.CharField(max_length=20) authors=models.ManyToMany('Author',through='Score') class Author(models.Model): name=models.CharField(max_length=20) class Score(models.Model): book=models.ForeignKey('Book') author=models.ForeignKey('Author') socre=models.IntegerField()
如果只寫manytomany,那么第三張是Django替我們建的,可以通過book.authors字段進行一系列操作(add(增),all(查),set(重置),remove(刪除)),但是此時沒法給第三張表加其他我們需要的字段,
而如果不寫,ManyToMany字段,那么我們可以通過Score來執行一些操作,但是此時book和author表已經沒有直接的聯系了,查詢起來很繁瑣
有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便業務,添加需要的字段
db_constraint :
db_constraint=False,這個就是保留跨表查詢的便利(雙下划線跨表查詢```),但是不用約束字段了,一半公司都用false,這樣就省的報錯,因為沒有了約束(Field字段對象,既約束,又建立表與表之間的關系)
limit_choices_to
限制關聯字段的對象范圍
related_name
反向查詢字段可以不用 表名小寫,可以改名了
db_table
第三張表的名字