Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2019 14:15:20

RobCapa
Зарегистрирован: 2019-10-30
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как обновить значения полей для экземпляра модели в Django?

Изучаю Django. Нигде не могу найти решения проблемы, с которой столкнулся, хотя задача чрезмерно стандартная. Допустим, у меня есть модель в файле models.py:

 from django.db import models
class Dog(models.Model):
    name = 'Шарик'

В бд есть 1 сохраненный экземпляр этой модели. В файле views.py есть функция:

 from .models import Dog
def my_update(request):
    i = Dog.objects.get(id=1)
    i.name = 'Бобик'
    i.save()

При вызове этой функции я хочу изменить значение поля name для определенного экземпляра. Но никакого сохранения в бд не происходит, имя остается прежним. Какой самый быстрый способ внести изменения в бд в моем случае?
Уточняю: мне не нужно менять поле всей модели. Мне нужно изменить значение этого поля у экземпляра и перезаписать этот экземпляр с новым значением

Офлайн

#2 Окт. 30, 2019 14:22:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как обновить значения полей для экземпляра модели в Django?

RobCapa
class Dog(models.Model):
name = ‘Шарик’
откуда вы это взяли? Покажите соответствующий пример из документации.



Офлайн

#3 Окт. 30, 2019 14:33:15

RobCapa
Зарегистрирован: 2019-10-30
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как обновить значения полей для экземпляра модели в Django?

FishHook

Я прописал значение данного поля сразу же, чтобы при создании экземпляра модели не вводить значение.
С тем же успехом это могло выглядеть так:
 class Dog(models.Model):
name = models.CharField(max_length=20)

Но проблему это не решит, так как я пытаюсь изменить не саму модель, а только ее экземпляр.
Экземпляр был сохранен корректно в бд. Он имеет поле name со значением ‘Шарик’. И я могу получить этот экземпляр и вызвать значение этого поля. Я даже могу дать ему новое значение в рамках функции
 i = Dog.objects.get(id=1)
i.name = 'Бобик'

Но вот внести это изменение для данного экземпляра в бд я не могу. Метод save просто не срабатывает, так что в бд данный экземпляр продолжает иметь значение name как ‘Шарик’

Отредактировано RobCapa (Окт. 30, 2019 14:35:16)

Офлайн

#4 Окт. 30, 2019 15:00:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как обновить значения полей для экземпляра модели в Django?

RobCapa
С тем же успехом это могло выглядеть так:
нет не могло бы,
вы не понимаете, как работает магия ОРМ в Джанго, но почему-то знаете, как оно могло бы.
Когда питон создает класс модели, он создает его не стандартным спосбом, а посредством метакласса. Метакласс проходит по всем полям будущего класса, и определяет, является ли поле наследником models.Field, и в этом случае регистрирует поле в каких-то своих внутренних кишках. Когда вы сделали вот так
    
class Dog(models.Model):
     name = 'Шарик'
ваше поле name никак не зарегистрировано, как участник объектно-реляционных отношений, Джанго не применяет к нему никакой магии - не записывает в базу, не читает оттуда, не создает миграцию, не создает связей M2M и M2O, не привязывает его к валидаторам, не создает полей формы, не учитывает в админке и тд. и т.п.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version