Что такое update и insert в django?

imosom

Новичок
Пользователь
Янв 2, 2021
12
2
3
Ростов на Дону
Всем привет, не могу найти нормальную документацию. Что такое insert, update? Как и когда происходит выполнение этих ф-й?
Происходит ли это автоматически?
Можно ли принудительно их запустить?
 

gad26032

Пользователь
Пользователь
Июл 26, 2021
18
7
3
Семантически:
insert - создать новый
update - обновить существующий

В Django доке insert и update могут встречаться как команда SQL и представлен такими методами объекта как .save() .get_or_create(), create() и т.д.
Например

Python:
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import AbstractUser

class АппUser(AbstractUser):
    pass
    

user = AppUser(username="Bob")
# В этот момент ты создал объект класса User но это объект пока что не сохранен
# что бы сохранить объект в базе нужно вызвать метод .save()

user.save()
# Под капотом ORM создаст примерно вот такой запрос и запустит его
{'sql':
 '''UPDATE "user_management_appuser"
         SET "password" = \'\',
             "last_login" = NULL,
             "is_superuser" = false,
             "username" = \'\',
             "first_name" = \'\',
             "last_name" = \'\',
             "email" = \'\',
             "is_staff" = false,
             "is_active" = true,
             "date_joined" = \'2021-07-26T13:30:20.374984+00:00\'::timestamptz
     WHERE "user_management_appuser"."id" = 3
        ''',
 'time': '0.008'}
# Таким образом метод save() использует для создания или обновления команду SQL `UPDATE`

# Другой способ создать пользователя это использовать метод create()
AppUser.objects.create(username="blah")
<AppUser: blah>
{'sql': '''INSERT INTO "user_management_appuser"
                ("password",
                "last_login",
                "is_superuser",
                "username",
                "first_name",
                "last_name",
                "email",
                "is_staff",
                "is_active",
                "date_joined")
            VALUES
                (\'\',
                NULL,
                false,
                \'blah\',
                \'\',
                \'\',
                \'\',
                false,
                true,
                \'2021-07-26T13:42:30.141972+00:00\'::timestamptz)
        RETURNING "user_management_appuser"."id"''',
 'time': '0.016'}
# Отличие этого метода в том что если пользователя нет то он будет создан и тебе вернется объект пользователя.
# Если объект уже существует то будет ошибка
AppUser.objects.create(username="blah")
...
django.db.utils.IntegrityError: duplicate key value violates unique constraint "user_management_appuser_username_key"
DETAIL:  Key (username)=(blah) already exists.

# Еще один метод это get_or_create()
# Отличие от .create() в том что при повторном вызое не будет ошибки и тебе вернется объект пользователя.

Создавать и получать объекты через DjangoORM есть много способов. Более подробно можеш почитать тут

P.S.
Если хочеш знать какие SQL запросы джанга строит то можеш использовать этот код сниппет

Python:
from django.db import connection

connection.queries
# вернет список всех запросов которые ты запускал

for i in connection.queries:
    print(i)
    
{'sql': 'UPDATE "user_management_appuser" SET "password" = \'\', "last_login" = NULL, "is_superuser" = false, "username" = \'\', "first_name" = \'\', "last_name" = \'\', "email" = \'\', "is_staff" = false, "is_active" = true, "date_joined" = \'2021-07-26T13:30:20.374984+00:00\'::timestamptz WHERE "user_management_appuser"."id" = 3', 'time': '0.008'}
{'sql': 'INSERT INTO "user_management_appuser" ("password", "last_login", "is_superuser", "username", "first_name", "last_name", "email", "is_staff", "is_active", "date_joined") VALUES (\'\', NULL, false, \'blah\', \'\', \'\', \'\', false, true, \'2021-07-26T13:42:30.141972+00:00\'::timestamptz) RETURNING "user_management_appuser"."id"', 'time': '0.016'}
 

Форум IT Специалистов