Django update_or_create с потенциально нулевым idenitfier
У меня есть функция в Django, которая принимает пост-запрос. Если этот пост-запрос включает id, я хочу обновить этот объект. Если пост-запрос посылает пустой/нулевой id, я хочу создать новый объект и попросить Django установить ID (первичный ключ) модели.
Вот что у меня есть:
def save_user_roster_to_db():
name = request.data['name']
id = request.data['id'] # this could be null/blank or be an ID
try:
user_roster = SavedUserRoster.objects.update_or_create(
id=id,
defaults={
"name": name,
}
)
return user_roster.pk
except:
raise Exception
Однако, похоже, что при создании нового объекта он пытается присвоить пустое/нулевое значение в качестве ID. Как я могу сказать Django, чтобы он устанавливал свой собственный ID (который является первичным ключом) при создании нового объекта?
Вы не можете использовать update_or_create с полем id. Потому что в текущей ситуации id может иметь значение None, а модель Django не может создать объект с id None.
Поэтому я думаю, что вы можете попробовать следующее.
def save_user_roster_to_db():
name = request.data['name']
id = request.data['id'] # this could be null/blank or be an ID
try:
if id:
user_roster = SavedUserRoster.objects.get(pk = id).update(name = name)
else:
user_roster = SavedUserRoster.objects.create(name = name)
return user_roster.pk
except:
raise Exception
Традиционно id автоматически генерируется и всегда уникален. В этом случае замена None id создаст исключение при первом создании записи.
Есть два возможных варианта.
ВАРИАНТ 1:
Создайте другое unique_identified, т.е. имя пользователя или электронную почту.
def save_user_roster_to_db():
name = request.data['name']
unique_identified = request.data['unique_identified'] # this could be null/blank or be an ID
user_roster, is_created = SavedUserRoster.objects.update_or_create(
unique_identified=unique_identified,
defaults={
"name": name,
}
)
return user_roster.pk
ВАРИАНТ 2:
Для создания:
Получите последнее id из базы данных и добавьте 1 с последним id, чтобы оно было следующим id значением, это позволит избежать исключения None.
Для обновления:
Он обновит запись существования в соответствии с id
def save_user_roster_to_db():
name = request.data['name']
id = request.data['id'] # this could be null/blank or be an ID
if id is None:
id = int(MyUserModel.objects.all().last().id)+1
user_roster, is_created = SavedUserRoster.objects.update_or_create(
id=id,
defaults={
"name": name,
}
)
return user_roster.pk