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