2017-02-10 6 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), похоже, не работает, а для нового экземпляра pk - None), я выбрал self.a = 0, который дал бы мне поведение, в котором я нуждаюсь.

Однако self и объект в self.thing.subthings.all() не имеют одинаковых значений, а оба имеют pk=187 в соответствии с выходом.

Являются ли они обоими одинаковыми объектами? Есть ли какое-то кэширование с related_name, что ломает мою логику?

Как я могу получить изменение self.a = 0, отраженное в запросе?

+1

Это определенно * не * тот же объект. И причина, по которой они не имеют такой же ценности, заключается в том, что вы делаете запрос 'subthings', прежде чем вы сохраните новое значение в базе данных. Я не понимаю, что вы пытаетесь сделать достаточно хорошо, чтобы предложить решение, возможно, вы можете уточнить. –

+0

, когда я сохраняю SubThing, в некоторых случаях мне нужно перебирать своих братьев и сестер (те, которые связаны с его Вещью) и изменять в них значения и сохранять их. Вся обработка заключена в транзакцию, чтобы гарантировать, что данные остаются в целом согласованными. –

+0

Но в чем проблема, с которой вы сталкиваетесь? Если вы пытаетесь исключить строку 'self' из дальнейшей обработки, просто пропустите объект в запросе' subthings', который имеет тот же PK. Это ваш вопрос, как это сделать? И есть ли причина, почему вы делаете '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