Метод Save () модели Django с обновлением связанного экземпляра - PullRequest
0 голосов
/ 23 ноября 2018

Я, вероятно, средний пользователь Django с довольно большим количеством RTFM под моим поясом.

У меня есть рабочий процесс, который примерно такой:

  1. Получить учетную запись (модель) объекта.
  2. Выполнение действий с объектом account (обновление полей и т. Д.)
  3. Создание связанного использования (model), используя account в качестве внешнего ключа.
  4. Обновите объект account как часть пользовательского save () для объекта using .
  5. (Сохраните все изменения в учетной записи , сделанные на шаге 2).

Модели :

class Account(models.Model):
    ...
    credit_balance = models.IntegerField(...)
    ...

class Usage(models.Model):
    ...
    account = models.ForeignKey(Account, ...)
    credit_balance = models.IntegerField(...)
    ...

    def save( self, *args, **kwargs ):
        """Custom usage save to update account stats."""
        if self.account:
            self.account.credit_balance = self.credit_balance
            self.account.save()

Код в различных функциях / методах :

account = Account.objects.get(pk=pk)

[do something to account]

usage = Usage.objects.create(account = account,
                             tariff_short_name = account.tariff.short_name,
                             **customer_data['usage'])

Что я действительно изо всех сил пытаюсь решить, если мне нужно сделать:

account.save()

На этом этапе,и каковы последствия?

Кажется, что изменения, которые я внес в учетную запись (например, в шаге 2), сохраняются, когда я сохраняю связанный объект account в использование объектпользовательский метод сохранения.

Почему?Как объект использование «знает», каково текущее состояние экземпляра объекта account ?

Я ожидал, что впоследствии придется сохранить учетную запись объект, потенциально с сохранением (update_fields = []), чтобы предотвратить перезапись обновления использование объекта в учетную запись модель.

Извините, это так эзотеричноЯ просто не понимаю поведение Джанго здесь.Кажется, я могу найти его в TFM, и мой поиск в Google не работает, так как я не уверен, что я ищу.

...