Почему мы пишем [0] после get_or_create в model_name.object.get_or_create () в django - PullRequest
2 голосов
/ 29 мая 2020

Функция в скрипте Faker для добавления данных в мой модельный отдел. department = ['I.T.','C.S.E','M.E.','E.C.'] def add_dept(): d = Department.objects.get_or_create(dept_name=random.choice(depatment))[0]

Ответы [ 4 ]

3 голосов
/ 29 мая 2020

get_or_create() - это метод набора запросов, который возвращает кортеж (d, created). где d - это экземпляр модели, а created - это флаг boolean, который сообщает нам, создан ли объект или нет.

поэтому, получив первый индекс, подобный этому * Фактически вы выполняете (d, created)[0], который всегда возвращает объект. Лучший способ сделать это - использовать подчеркивание (_), чтобы игнорировать созданный флаг, например:

d, _ = Department.objects.get_or_create(dept_name=random.choice(depatment))

ссылка: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#get -или-create

1 голос
/ 29 мая 2020

Это потому, что get_or_create возвращает кортеж, и обычно вас интересует только полученный или созданный object (первый элемент), а не логическое значение, указывающее, был ли объект только что создан (второй элемент).

Из документации по get_or_create:

Возвращает кортеж (object, created), где object - это полученный или созданный объект, а created - это логическое значение, указывающее, был ли создан новый объект.

Хотя вы также можете использовать синтаксис:

def add_dept():
    d, _ = Department.objects.get_or_create(dept_name=random.choice(depatment))
1 голос
/ 29 мая 2020

Потому что .get_or_create(…) [Django -doc] возвращает 2-кортеж, где первый элемент - это созданный или полученный объект Department, а второй является логическим (True или False), то есть True, если объект был создан, как указано в документации:

Возвращает кортеж (object, created), где object - это извлеченный или созданный объект, а created - это логическое значение, определяющее, был ли создан новый объект.

Добавляя [0], вы таким образом получаете первый элемент из двух кортежей: отдел , и, таким образом, отбросить логическое значение.

0 голосов
/ 29 мая 2020

Вызываемая функция возвращает список или кортеж. В любом случае [0] просто извлекает первый элемент из результата и отбрасывает все оставшиеся результаты.

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