2015-03-13 37 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