3

我正在使用 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数据库中有这样的一行

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']

不知道我做错了什么。任何帮助将不胜感激

4

3 回答 3

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 样式指南并将您的类名大写。

于 2015-03-13T07:34:47.560 回答
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
于 2015-03-15T06:30:02.590 回答
0

如果要删除的元素不在该列表中,则直接访问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)
)
于 2018-05-03T08:44:04.990 回答