Python django相关的_名称查询和self不是同一个对象?

Python django相关的_名称查询和self不是同一个对象?,python,django,django-models,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) + ' -

我有点像:

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()
我被上面代码的输出搞糊涂了。在某些条件下,保存子项时,我需要重新计算子项的同级。查询
self.thing.subthings.all()
包括
self
,由于我无法可靠地排除它(
.exclude(self)
似乎不起作用,对于一个新实例
pk
None
),我选择
self.a=0
,这将提供我需要的行为

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

它们是否都是同一个物体?
相关的\u name
是否发生了一些缓存,从而破坏了我的逻辑


如何使更改
self.a=0
反映在queryset中?

在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

在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

它们绝对不是同一个物体。它们不具有相同值的原因是,在将新值保存到数据库之前,您正在执行
子任务
查询。我不明白你想做什么来提供一个解决方案,也许你可以澄清一下。当我保存子项时,在某些情况下,我需要迭代它的同级项(链接到它的东西的同级项),更改其中的值并重新保存。整个处理过程都封装在一个事务中,以确保数据总体上保持一致。但在这样做时,您面临的问题是什么?如果您试图从进一步的处理中排除
self
行,只需跳过
子内容
查询中具有相同主键的对象即可。这是你的问题吗,怎么做?你为什么要做
setattr(self'a',0)
而不是
self.a=0
?我的问题是为什么在
self
上更改属性不会反映在查询结果
self.thing.subthings.all()
上。我可能可以通过跳过你描述的对象来解决这个问题(虽然如果
self.pk==None
如何筛选它?),但我试图了解如何在查询集中反映我的更改。我更新了问题。我使用了setattr(self,'a',0)最初是因为我的真实代码实际上在一个属性列表上循环。但我认为这不会影响问题。它们肯定不是同一个对象。它们没有相同的值的原因是,在将新值保存到数据库之前,您正在执行
子任务
查询。我不明白您在尝试什么o在提供解决方案方面做得足够好,也许您可以澄清一下。当我保存子项时,在某些情况下,我需要迭代它的同级(与它的东西链接的同级)并更改其中的值并重新保存。整个处理过程封装在一个事务中,以确保数据总体上保持一致。但这样做会遇到什么问题?如果您试图将
self
行排除在进一步处理之外,只需跳过包含sam的
子任务中的对象即可这是你的问题吗?怎么做?你为什么要做
setattr(self'a',0)
而不是
self.a=0
?我的问题是为什么在
self
上更改属性不会反映在查询结果
self.thing.subthings.all()
。我可能可以通过跳过您描述的对象来解决这个问题(尽管如果
self.pk==None
我如何筛选它?),但我正在试图了解如何在查询集中反映我的更改。我更新了问题。我使用了setattr(self,'a',0)最初是因为我真正的代码实际上循环了一系列属性,但我认为这不会影响问题的解决。