2015-03-13 34 views
2
删除元素

我使用Django 1.8a1,并有我的模型是这样 -和PostgreSQL的ArrayField在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 

我想删除购物车中的一些商品详情

我写了下面的代码

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

没能得到期望的结果。即使在保存之后,更改也不会反映在数据库中..... – 2015-03-13 08:36:42

+0

如何检查更改是否在数据库中?你记得提交你的数据库事务吗? – 2015-03-14 02:12:15

+0

问题在于列cart_details ...在ArrayField以外的类型的任何其他列上,我可以使用obj.save()方法更新值...不需要对db进行手动提交。我认为他们是ArrayField类型的列的一些问题。 Django orm无法处理这类字段(可能是因为django 1.8仍在开发阶段) – 2015-03-14 11:07:02

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

我认为你看到的是Django ORM中的懒惰评估。具体来说,查询实际上只在你说'obj [0]'时才运行,并且它提取你的行。在注释掉的例子中,你只需读取一次并从数组字段中删除某些内容。那么,你再次调用'obj [0]',它从数据库运行另一个干净的提取,并保存第二个未改变的提取对象。如此有效,你什么都不做。 – 2016-07-19 01:52:26