django related_name查询和自己不是同一个对象?

时间:2017-02-10 06:58:38

标签: python django django-models

我有类似的东西:

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)似乎不起作用,而新实例pk是{{1} }}),我选择了None,它会给我我需要的行为。

但是,self.a = 0self中的对象不包含相同的值,而根据输出,两者都有self.thing.subthings.all()

它们是否是同一个对象而不是? pk=187是否存在一些违反逻辑的缓存?

如何在查询集中反映出更改related_name

1 个答案:

答案 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