Django數(shù)據(jù)模型中on_delete使用詳解
on_delete屬性針對外鍵ForeignKey
一、django3.0官方文檔介紹:
Many-to-one relationships多對一關(guān)系
To define a many-to-one relationship, use django.db.models.ForeignKey. You use it just like any other Field type: by including it as a class attribute of your model.
ForeignKey requires a positional argument: the class to which the model is related.
For example, if a Car model has a Manufacturer – that is, a Manufacturer makes multiple cars but each Car only has one Manufacturer – use the following definitions:
from django.db import models class Manufacturer(models.Model): # ... pass class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE) # ...
You can also create recursive relationships (an object with a many-to-one relationship to itself) and relationships to models not yet defined; see the model field reference for details.
It's suggested, but not required, that the name of a ForeignKey field (manufacturer in the example above) be the name of the model, lowercase. You can, of course, call the field whatever you want.
常見的使用方式(設(shè)置為null)
class ApiList(models.Model): desc = models.CharField(max_length=255, verbose_name="接口描述") keyword = models.CharField(max_length=100, verbose_name="請求關(guān)鍵字") response = models.TextField(verbose_name="響應(yīng)結(jié)果") api = models.ForeignKey(Api, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="所屬接口") status = models.IntegerField(default=1, verbose_name="狀態(tài)") create_at = models.CharField(max_length=20, verbose_name="創(chuàng)建時間") update_at = models.CharField(max_length=20, verbose_name="更新時間")
class ForeignKey(ForeignObject): def __init__(self, to, on_delete, related_name=None, related_query_name=None, limit_choices_to=None, parent_link=False, to_field=None, db_constraint=True, **kwargs): super().__init__(to, on_delete, from_fields=['self'], to_fields=[to_field], **kwargs)
class OneToOneField(ForeignKey): def __init__(self, to, on_delete, to_field=None, **kwargs): kwargs['unique'] = True super().__init__(to, on_delete, to_field=to_field, **kwargs)
on_delete=None, # 刪除關(guān)聯(lián)表中的數(shù)據(jù)時,當(dāng)前表與其關(guān)聯(lián)的field的行為 on_delete=models.CASCADE, # 刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)也刪除 on_delete=models.DO_NOTHING, # 刪除關(guān)聯(lián)數(shù)據(jù),什么也不做 on_delete=models.PROTECT, # 刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯誤ProtectedError # models.ForeignKey('關(guān)聯(lián)表', on_delete=models.SET_NULL, blank=True, null=True) on_delete=models.SET_NULL, # 刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空,一對一同理) # models.ForeignKey('關(guān)聯(lián)表', on_delete=models.SET_DEFAULT, default='默認(rèn)值') on_delete=models.SET_DEFAULT, # 刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認(rèn)值(前提FK字段需要設(shè)置默認(rèn)值,一對一同理) on_delete=models.SET, # 刪除關(guān)聯(lián)數(shù)據(jù), a. 與之關(guān)聯(lián)的值設(shè)置為指定值,設(shè)置:models.SET(值) b. 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對象的返回值,設(shè)置:models.SET(可執(zhí)行對象)
class ManyToManyField(RelatedField): def __init__(self, to, related_name=None, related_query_name=None, limit_choices_to=None, symmetrical=None, through=None, through_fields=None, db_constraint=True, db_table=None, swappable=True, **kwargs): super().__init__(**kwargs)
二、on_delete外鍵刪除方式
- CASCADE:級聯(lián)刪除。當(dāng)Manufacturer對象刪除時,它對應(yīng)的Car對象也會刪除。
- PROTECT:保護(hù)模式,采用該選項,刪除時會拋出ProtectedError錯誤。
- SET_NULL:置空模式,刪除的時候,外鍵字段被設(shè)置為空,前提就是blank=True, null=True,定義該字段的時候,允許為空。當(dāng)Manufacturer對象刪除時,它對應(yīng)的Car對象的manufacturer字段會置空,前提是null=True
- SET_DEFAULT:置默認(rèn)值,刪除的時候,外鍵字段設(shè)置為默認(rèn)值,所以定義外鍵的時候注意加上一個默認(rèn)值。
- SET():自定義一個值,該值當(dāng)然只能是對應(yīng)的實體了
django3.0關(guān)于models官方文檔地址:
1.https://docs.djangoproject.com/en/3.0/topics/db/models/
2.https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey
到此這篇關(guān)于Django數(shù)據(jù)模型中on_delete使用詳解的文章就介紹到這了,更多相關(guān)Django on_delete使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python發(fā)送多人郵件沒有展示收件人問題的解決方法
這篇文章主要為大家詳細(xì)介紹了python發(fā)送多人郵件沒有展示收件人問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Python?中設(shè)置請求的最大重試次數(shù)示例代碼
本篇文章介紹了為什么我們會收到錯誤消息,指出超出了最大重試次數(shù),以及我們?nèi)绾卧?Python?中為請求設(shè)置?max_retries,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-06-06Python selenium 父子、兄弟、相鄰節(jié)點定位方式詳解
這篇文章主要介紹了Python selenium 父子、兄弟、相鄰節(jié)點定位方式詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解
這篇文章主要為大家介紹了如何使用 dlib 庫在實時視頻中有效地跟蹤多個對象,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-03-03