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
Вернуться на верх