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)最初是因为我真正的代码实际上循环了一系列属性,但我认为这不会影响问题的解决。