user = User.objects.get_or_create (first_name = fk_first_name, last_name = fk_last_name, email = fk_email) [0] почему используется [0] - PullRequest
1 голос
/ 06 апреля 2020

в этом python коде, который создает поддельное имя с электронной почтой:

from faker import Faker
from .models import User
fk=Faker()

def populate(N=5):
    for entry in range(N):
        fk_name=fk.name().split()
        fk_first_name=fk_name[0]
        fk_last_name=fk_last[1]
        fk_email=fk.email()

        user=User.objects.get_or_create(first_name=fk_first_name,last_name=fk_last_name,email=fk_email)[0]
if __name__=='__main__':
    inp=int(input("please enter the integer value for population"))
    print('Populating ......................')
    populate(inp)
    print("population is done \n")

у этого пользователя = User.objects.get_or_create (first_name = fk_first_name, last_name = fk_last_name, email = fk_email) [0 ] почему используется [0]

1 Ответ

1 голос
/ 06 апреля 2020

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

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

Таким образом, это означает, что если мы напишем:

some_obj = MyModel.objects.get_or_created()

, то some_obj будет 2-кортежем, а не MyModel объектом. Мы можем использовать подписку для доступа к первому элементу, например:

some_obj = MyModel.objects.get_or_created()<b>[0]</b>

Обычно используется итеративная распаковка, и записать это как:

some_obj<b>, __</b> = MyModel.objects.get_or_created()

здесь мы сохраняем объекта в some_obj, и мы используем другую переменную __ для сохранения логического значения, если нам все равно, создан объект или нет.

...