[英]Can we define models.CASCADE only without using on_delete?
據我所知,當我們在 django 中定義外鍵時,我們可以設置為on_delete=models.CASCADE
。
最近我看到了類似content_type = models.ForeignKey(ContentType,models.CASCADE)
的代碼。
我的問題是 django 是否允許在不使用 on_delete 的情況下定義 models.CASCADE? 或者,如果我們像上面定義的那樣,它的工作方式會有所不同嗎?
content_type = models.ForeignKey(
ContentType,
models.CASCADE,
verbose_name=_('content type'),
)
是的,我們可以做到。
要清楚地理解它,請嘗試理解以下代碼:
def fn(x, y, z=0):
print('x =', x, 'y =', y, 'z =', z)
fn(1, 2) # Prints: x = 1 y = 2 z = 0
fn(1, 2, 3) # Prints: x = 1 y = 2 z = 3
fn(1, y=2) # Prints: x = 1 y = 2 z = 0
fn(1, y=2, z=3) # Prints: x = 1 y = 2 z = 3
fn(x=1, y=2) # Prints: x = 1 y = 2 z = 0
fn(x=1, y=2, z=3) # Prints: x = 1 y = 2 z = 3
fn(y=2, z=3, x=1) # Prints: x = 1 y = 2 z = 3
現在,看看ForeignKey 的源代碼。 它看起來像這樣:
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,
):
...
所以,當我們寫:
content_type = models.ForeignKey(
ContentType,
models.CASCADE,
verbose_name=_('content type'),
)
參數to
將是ContentType
,參數on_delete
將是models.CASCADE
。
這與寫作完全相同:
content_type = models.ForeignKey(
on=ContentType,
on_delete=models.CASCADE,
verbose_name=_('content type'),
)
在不寫on_delete
的情況下定義外鍵應該可以工作,因為__init__或ForeignKey的第二個參數是 on delete,見下文:
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):
這是Github上的行。
指定鍵名“on_delete”無需按順序排列 arguments,但由於它是第二個參數,因此它可以雙向工作。
但是例如,如果您需要db_constraint ,則需要使用 keyName 指定它,或者還提供介於兩者之間的所有其他 arguments ,在這種情況下使用密鑰名稱會使其更容易且不有序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.