Django orm создает копию экземпляра вместо доступа к нему
У меня есть, как мне кажется, довольно сложный вопрос в Django, и это orm.
Это не работает :
cartitemproduct_in_cart_session.get().quantity+=1
cartitemproduct_in_cart_session.get().save()
Если я проверю сразу после этого значение cartitemproduct_in_cart_session.get().quantity, оно не было обновлено
Это работает :
cartitem_session=cartitemproduct_in_cart_session.get()
cartitem_session.quantity+=1
cartitem_session.save()
Значение было обновлено
Но почему?
(cartitemproduct_in_cart_session - queryset, результат фильтра, но я думаю это не имеет значения : cartitemproduct_in_cart_session=cart_session.cartitem_set.filter(product__slug=cartitem.product.slug
) )
Я предполагаю, что каким-то образом, когда я делаю cartitemproduct_in_cart_session.get().quantity, поле quantity становится новым атрибутом cartitemproduct_in_cart_session.get() и больше не связано с полем в базе данных, но я не понимаю, почему...
Почему необходимо сначала присвоить экземпляру модели имя, чтобы обновить поля этого экземпляра?
cartitemproduct_in_cart_session.get().quantity+=1
cartitemproduct_in_cart_session.get().save()
эквивалентно:
x = cartitemproduct_in_cart_session.get()
x.quantity += 1
y = cartitemproduct_in_cart_session.get()
y.save()
# note that x and y are different objects with different memory addresses
while
cartitem_session=cartitemproduct_in_cart_session.get()
cartitem_session.quantity+=1
cartitem_session.save()
эквивалентно:
x = cartitemproduct_in_cart_session.get()
x.quantity += 1
x.save()