У меня есть что-то вроде: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)
, похоже, не работает, а для нового экземпляра pk
- None
), я выбрал self.a = 0
, который дал бы мне поведение, в котором я нуждаюсь.
Однако self
и объект в self.thing.subthings.all()
не имеют одинаковых значений, а оба имеют pk=187
в соответствии с выходом.
Являются ли они обоими одинаковыми объектами? Есть ли какое-то кэширование с related_name
, что ломает мою логику?
Как я могу получить изменение self.a = 0
, отраженное в запросе?
Это определенно * не * тот же объект. И причина, по которой они не имеют такой же ценности, заключается в том, что вы делаете запрос 'subthings', прежде чем вы сохраните новое значение в базе данных. Я не понимаю, что вы пытаетесь сделать достаточно хорошо, чтобы предложить решение, возможно, вы можете уточнить. –
, когда я сохраняю SubThing, в некоторых случаях мне нужно перебирать своих братьев и сестер (те, которые связаны с его Вещью) и изменять в них значения и сохранять их. Вся обработка заключена в транзакцию, чтобы гарантировать, что данные остаются в целом согласованными. –
Но в чем проблема, с которой вы сталкиваетесь? Если вы пытаетесь исключить строку 'self' из дальнейшей обработки, просто пропустите объект в запросе' subthings', который имеет тот же PK. Это ваш вопрос, как это сделать? И есть ли причина, почему вы делаете 'setattr (self, 'a', 0)' скорее 'self.a = 0'? –