我们可以定义模型。仅在不使用on_delete的情况下进行CASCADE吗?

问题描述 投票:2回答:2

据我所知,当我们在Django中定义外键时,我们可以像on_delete=models.CASCADE那样进行设置。

最近我见过类似content_type = models.ForeignKey(ContentType,models.CASCADE)的代码。

我的问题是django是否允许在不使用on_delete的情况下定义model.CASCADE?或者,如果我们像上面那样定义,它的工作方式是否有所不同?

content_type = models.ForeignKey(
        ContentType,
        models.CASCADE,
        verbose_name=_('content type'),        
    )
python django database django-models
2个回答
0
投票

是的,我们可以做到。

要知道为什么要看source code of 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'),        
)

0
投票

无需编写on_delete即可定义外键,因为__ init __ForeignKey的第二个参数已删除,请参见下文:

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”不需要按顺序排列参数,但是由于它是第二个参数,因此可以同时使用。

但是例如,如果您需要db_constraint,则需要使用keyName进行指定,或者也要在两者之间提供所有其他参数,在这种情况下使用密钥名将使其更容易并且不整齐。

© www.soinside.com 2019 - 2024. All rights reserved.