簡體   English   中英

我們可以只定義models.CASCADE而不使用on_delete嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM