Django метод save () не сохраняется - PullRequest
0 голосов
/ 10 июня 2018

Я использую сигнал для обновления полей в таблице профиля, когда новые инвестиции сделаны.

Используя несколько операторов print внутри функции update_users_investments, я вижу, что функция вызывается и выполняет правильные вычисления.

Тем не менее, он не сохраняется в базе данных, и нет ошибки.

Вы видите, почему это не экономит?И есть ли лучший способ отладки метода сохранения?Я оглянулся и ничего не вижу, и не зная почему это не экономит, очень расстраивает.

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

Сигнал

@receiver(post_save, sender=Investment)
def update_users_investments(sender, instance, created, **kwargs):
    user = Profile.objects.get(user=instance.user.user)
    total_investments = user.total_invested
    investment = instance.transaction_type * instance.price * instance.number_shares
    user.total_invested = total_investments + investment
    user.save()

Модель для сохранения в:

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    total_invested = models.DecimalField(max_digits=5, decimal_places=2)
    cash_avaliable = models.DecimalField(max_digits=5, decimal_places=2,
                                     null=True)

Модель инвестиций (откуда поступает сигнал):

class Investment(models.Model):

"""Model representing each investment made by users"""

    user = models.ForeignKey(Profile, on_delete=models.DO_NOTHING)

    team_code = models.ForeignKey(Team,
                           on_delete=models.DO_NOTHING)

    transaction_type = models.IntegerField(choices=((-1, "Sell"), (1, "Buy")),
                                       help_text="Show whether transaction\
                                       was a buy or sell",
                                       verbose_name="Transaction Type")

    number_shares = models.IntegerField(help_text="Number of shares bought or \
                                    sold in this transaction",
                                    verbose_name="Number of Shares")

    price = models.DecimalField(help_text = "Current Price of the team",
                                    verbose_name = "Current Price", decimal_places=2, max_digits=5)

    transaction_date = models.DateTimeField(auto_now=True, help_text="Date and \
                                        Time of transaction",
                                        verbose_name="Transaction Date")

    transaction_mode = models.IntegerField(choices=((-1, "User Generated"),
                                                (1,
                                                 "Automatically Generated")))

Редактировать

Решил эту проблему - как указано, user = Profile.objects.get (user = instance.user.user) не требуется.

@receiver(post_save, sender=Investment)
def update_users_investments(sender, instance, created, **kwargs):
    total_investments = instance.user.total_invested
    investment = instance.transaction_type * instance.price * instance.number_shares
    instance.user.total_invested = total_investments + investment
    instance.user.save()

Теперь появляется, чтобы заставить его работать: -)

1 Ответ

0 голосов
/ 28 апреля 2019

У меня была та же проблема, и все мои отладочные отпечатки выглядели правильно, но я не мог получить набор данных.

Согласно https://realpython.com/modeling-polymorphism-django-python/:

"Вы использовали встроенный в Django механизм проверки для обеспечения соблюдения правил целостности данных. Clean () вызывается только автоматически из форм Django.объекты, которые не созданы формой Django, вам необходимо явно проверить объект. "

Я пытался как напрямую сохранить в поле, так и с помощью save () в представлении, а также с помощью методав модели.Например:

def set_date_paid(self,date_str):
    self.date_paid = date_str

С этим методом я все еще выполнял save () в представлении, которое вызвало метод.Я решил сохранить поле в методе моделей следующим образом:

def set_date_paid(self,date_str):
    self.date_paid = date_str
    self.save(update_fields=["date_paid"])

В результате я наконец-то получил ошибку о том, что мои данные неверны.

Моя ошибка состояла в том, что я ожидал получить ошибку проверки.Но, как указывается в статье и руководстве, это не так.

Узнав об этом, я убедился, что проверяю данные в правильном формате и данные сохраняются нормально.Я не возвращался к выполнению save () в представлении, но я продолжаю работать с моделью даже для обновлений с одним полем.Я еще не очень "питоничен", поэтому я уверен, что есть лучшие способы, но я надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...