2017-02-10 36 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