2017-02-10 37 views
1

我有類似:django related_name查詢和自己不一樣的對象?

class Thing(models.Model): 
    pass 

class SubThing(models.Model): 
    thing = models.ForeignKey(Thing, related_name='subthings') 
    a = models.DecimalField() 
    # some more Decimal fields 

    def __str__(): 
     return str(self.pk) + ' - ' + str(self.a) 

    def save(): 
     self.a = 0 
     print(self) # outputs 187 - 0 
     print(self.thing.subthings.all()) # outputs ... 187 - 20 ... 
     # do some calculations on self and siblings 
     Super(SubThing, self).save() 

我通過上面的代碼的輸出混淆。在某些情況下,我需要重新計算SubThing的兄弟節點。查詢self.thing.subthings.all()包括self,由於我無法可靠地排除它(.exclude(self)似乎不起作用,並且對於新實例pkNone),所以我選擇了self.a = 0,這會給我所需的行爲。

但是,selfself.thing.subthings.all()中的對象不保持相同的值,但根據輸出結果都有pk=187

他們都是同一個對象而不是? related_name有沒有緩衝我的邏輯?

我將如何獲得在查詢集中反映的更改self.a = 0

+1

他們絕對*不是*同一個對象。而他們不具有相同價值的原因是,在將新值保存到數據庫之前,您正在執行'subthings'查詢。我不明白你在做什麼,以便提供解決方案,或許你可以澄清。 –

+0

當我保存SubThing時,在某些情況下,我需要遍歷它的兄弟姐妹(鏈接到它的Thing)並更改它們中的值並重新保存它們。整個處理過程被封裝在一個交易中,以確保數據在整體上保持一致。 –

+0

但是你在做什麼時遇到了什麼問題?如果您試圖排除'self'行進一步處理,只需跳過具有相同PK的'subthings'查詢中的對象。這是你的問題,該怎麼做?是否有一個原因,你爲什麼要'setattr(self,'a',0)'而不是'self.a = 0'? –

回答

0

在Python模型實例上設置屬性不會導致數據庫發生更改。這就是save()方法的目的。所以如果你想看到你的後續查詢中反映的實例保存的更改,則需要先進行模型保存。

def save(): 
     self.a = 0 
     super(SubThing, self).save() # persists your changes to the database 

     self.thing.subthings.all() # will reflect the updated value 
     # do stuff