2016-09-29 36 views
0

我不明白這一點。這種模式有一個類方法,以查找所有地址,並更新它們,但它不工作:Django不更新classmethod中的對象。很奇怪

views.py

address = Address.objects.get(id=address_id) 
default = request.data.get("default", address.default) 
if default.lower() == "true":   
    print "default is true" 
    Address.set_default_address(address.id, address.client) 
else: 
    print "default is false" 
    address.default = default 

print "in view -> address.id - address.default: %s - %s" % (address.id, address.default) 

Address.set_default_address:

class Address(models.Model): 
    ... 
    default = models.BooleanField(default=False) 

    @classmethod 
    def set_default_address(cls, address_id, client): 
     client_addresses = Address.objects.filter(client=client) 
     print "client_addresses: %s" % client_addresses 
     for address in client_addresses: 
      if address.id != address_id: 
       print "address is set to False - address id: %s" % address.id 
       address.default = False 
       address.save() 
      else: 
       print "address is set to True! - address id: %s" % address.id 
       address.default = True 
       address.save() 
       print "classmethod address.id - address.default: %s - %s" % (address.id, address.default) 

的如果新地址必須設置爲default=True並將所有其他地址更改爲default=False,則設計爲classmethod

打印輸出看起來像這樣:

默認爲true

client_addresses:[,]

地址被設定爲假 - 地址ID:1個

地址被設置爲真! - 地址編號:2

類方法address.id - address.default:2 - 真

鑑於 - > address.id - address.default:2 - 假

正如你所看到的,在classmethod中調用的打印看起來像它將address.default設置爲True,但視圖中的打印顯示相反。爲什麼?

回答

1

將地址保存在類方法中時,它會更新數據庫中的對象,但不會更新視圖中的對象。

您可以調用refresh_from_db方法來重新加載數據庫中的值。

if default.lower() == "true":   
    print "default is true" 
    Address.set_default_address(address.id, address.client) # updates the object in the db 
    print address.default # will print False 
    address.refresh_from_db() 
    print address.default # will print True 

有關更多詳細信息,請參閱refreshing objects from the database上的文檔。