2015-03-13 4 views
2

Я использую Джанго 1.8a1 и есть моя модель, как это -Удалить элемент из ArrayField из PostgreSQL в Django

from django.contrib.postgres.fields import ArrayField 
from django.contrib.auth.models import User 
# Create your models here. 

class cart(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    cart_details = ArrayField(models.CharField(max_length=200), null=True, blank=True) 
    def __str__(self): # __unicode__ on Python 2 
     return self.name.username 

У меня есть ряд в моем postgres дб как этого

select * from cart_cart; 
id |   cart_details   | user_id 
----+---------------------------------+--------- 
    1 | {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2} |  1 

I хотел бы удалить некоторые элементы в корзину Подробное описание

Я написал следующий код

obj = cart.objects.filter(user=request.user, cart_details__contains=[product_id]) 
if obj.exists(): 
    obj[0].cart_details = obj[0].cart_details.remove(str(product_id)) 
    obj[0].save() 

я пытался что-то вроде этого, но это также не работает

print obj[0].cart_details 
[u'2', u'2', u'2', u'2', u'2', u'2', '2'] 
lis1=obj[0].cart_details 
lis1.remove('2') 
print lis1 
[u'2', u'2', u'2', u'2', u'2', u'2',] 
obj[0].cart_details = lis1 
obj.save() 
print obj[0].cart_details 
[u'2', u'2', u'2', u'2', u'2', u'2', '2'] 

Не знаю, что я делаю неправильно. Любая помощь будет глубоко оценена

ответ

0

Необходимо обновить obj[0] из базы данных, так как изменения в базе данных автоматически не отражаются на уже загруженных объектах.

obj.save() 
obj_refreshed = cart.objects.filter(user=request.user, cart_details__contains=[product_id]) 
print(obj_refreshed[0].card_details) 

Кроме того, я любезно предлагаю вам следовать PEP-8 Python style guide и прописные ваши имена классов.

+0

Не удалось получить желаемый результат. Даже после сохранения изменения не отражаются в базе данных ..... –

+0

Как вы проверяете, находятся ли изменения в базе данных или нет? Помните, что вы совершаете транзакцию с базой данных? –

+0

Проблема заключается в столбце cart_details ... В любом другом столбце с типом, отличным от ArrayField, я смог обновить значение с помощью метода obj.save() ... Нет необходимости выполнять ручную фиксацию на db. Я думаю, что их проблема связана с столбцами типа ArrayField. Django orm не может обрабатывать такое поле (возможно, потому, что django 1.8 все еще находится в стадии разработки) –

0

я смог обновить столбец cart_details, слегка изменив код (хотя я не был в состоянии понять причину)

product_id = str(request.data.get('product_id')) 
obj = cart.objects.filter(user=request.user, cart_details__contains=[product_id]) 
if obj.exists(): 
    # This didnt work.... 
    #obj[0].cart_details.remove(product_id) 
    #obj[0].save() 
    #print obj[0].cart_details 

    # This works.... 
    cart_object = obj[0] 
    cart_object.cart_details.remove(product_id) 
    cart_object.save() 
    #print cart_object.cart_details 
+0

Я думаю, что то, что вы видите, - это ленивая оценка в ORM Django. В частности, запрос фактически выполняется только тогда, когда вы говорите 'obj [0]', и он извлекает вашу строку. В примере с комментариями вы извлекаете один раз и удаляете что-то из поля массива. Затем вы снова вызываете 'obj [0]', который запускает другую чистую выборку из db и сохраняет этот второй, неизменный, извлеченный объект. Так эффективно, вы ничего не делаете. –