Есть ли лучший способ получить созданный объект?

У меня есть этот код, и я хочу сохранить созданного пользователя и вопрос в переменной в одной строке, а не делать это таким странным способом, возможно ли это вообще?:

    if UserProfile.objects.filter(discord_id=request.data['author_id']).exists():
        profile = UserProfile.objects.get(discord_id=request.data['author_id'])
    else:
        x = UserProfile.objects.create(discord_id=request.data['author_id'], name=request.data['name'])
        profile = UserProfile.objects.get(discord_id=request.data['author_id'])

    Question.objects.create(title=request.data['title'], author=profile, points=int(request.data['points']))
    question = Question.objects.filter(author=profile, title=request.data['title'])[0]

Да, именно для этого существует get_or_create. Поэтому используйте:

obj, created = MyModel.objects.get_or_create(...)

Удобный метод для поиска объекта с заданными kwargs (может быть пустым, если ваша модель имеет значения по умолчанию для всех полей) и создания его при необходимости.

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

Это предназначено для предотвращения создания дубликатов объектов при параллельном выполнении запросов, а также в качестве сокращения кода boilerplatish.

Обратите внимание, что Model.create также вернет созданный объект, нет необходимости запрашивать его снова.

obj  = MyModel.create(...)
Вернуться на верх