Python 在Django中从PostgreSQL的ArrayField中删除元素

Python 在Django中从PostgreSQL的ArrayField中删除元素,python,django,postgresql,django-1.8,Python,Django,Postgresql,Django 1.8,我使用的是django 1.8a1,我的模型如下- 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_detai

我使用的是django 1.8a1,我的模型如下-

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 db中有一行是这样的

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']
不知道我做错了什么。非常感谢您提供的任何帮助

您需要从数据库中刷新obj[0],因为对数据库的更改不会自动反映到已加载的对象实例

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

此外,我还建议您遵循类名并大写。

我能够通过稍微修改代码来更新cart\u 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
如果要删除的元素不在该列表中,直接访问card_details会引发ValueError

但你可以这样做:

from django_postgres_extensions.models.functions import ArrayRemove
cart.objects.filter(
   cart_details__contains=[element]
).update(
   cart_details=ArrayRemove('cart_details', element)
)

不能得到想要的结果。即使在保存之后,更改也不会反映在数据库中……如何检查更改是否在数据库中?您是否记得提交数据库事务?问题在于列cart\u details。。。在任何其他类型不是ArrayField的列上,我可以使用obj.save方法更新值。。。不需要对数据库执行手动提交。我认为他们的问题在于ArrayField类型的列。Django orm无法处理此类字段可能是因为Django 1.8仍处于开发阶段请回答:如何检查更改是否在数据库中?发布您的代码。我刚刚做了一个“select*from”来确认行是否已更新。我认为您看到的是Django ORM中的延迟计算。具体地说,查询实际上只在您说obj[0]并获取您的行时运行。在注释掉的示例中,获取一次并从数组字段中删除一些内容。然后,再次调用obj[0],它从数据库中运行另一个干净的获取,并保存第二个未更改的获取对象。实际上,你什么也不做。