Можем ли мы определить модели. CASCADE только без использования on_delete? - PullRequest
4 голосов
/ 15 октября 2019

Насколько я знаю, когда мы определяем внешний ключ в django, мы можем установить как on_delete=models.CASCADE.

Недавно я видел код, подобный content_type = models.ForeignKey(ContentType,models.CASCADE).

Мой вопрос таков:django позволяет определять модели. CASCADE без использования on_delete? ИЛИ если мы определили как выше, это работает по-другому?

content_type = models.ForeignKey(
        ContentType,
        models.CASCADE,
        verbose_name=_('content type'),        
    )

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Да, мы можем это сделать.


Чтобы понять это, постарайтесь понять следующий код:

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'),        
)
1 голос
/ 15 октября 2019

Определение внешнего ключа без записи 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 или предоставить все остальные аргументы между ними, какхорошо, использование имени ключа в этом случае облегчит и не будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...