Есть ли лучший способ получить созданный объект?
У меня есть этот код, и я хочу сохранить созданного пользователя и вопрос в переменной в одной строке, а не делать это таким странным способом, возможно ли это вообще?:
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(...)