我正在使用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']
不知道我做错了什么。任何帮助将深表赞赏
答案 0 :(得分: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并大写您的班级名称。
答案 1 :(得分: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
答案 2 :(得分: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)
)