Почему не происходит запись в таблицу во время save() в django?

Делаю приложение для компании, использующей сетевой маркетинг. Уровень поддерева называется "линией". То есть те, кого я пригласил - первая линия, те, кого пригласила вторая линия - третья и так далее.

Когда на 1 линии собирается 5 новеньких - за каждого из них начисляется A
Когда на 2 линии собирается 5 новеньких - за каждого из них начисляется B
Когда на 3 линии собирается 5 новеньких - за каждого из них начисляется C
Когда на 4 линии собирается 5 новеньких - за каждого из них начисляется D

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

Теперь проблема: когда я создаю на 1, 3, или 4 линии участника n 5 участников - ему самому начисляется не 5A, 5C, 5D денег соответственно, а A, C и D. То есть, в 5 раз меньше. Но за вторую линию он получает как надо. Прям магия какая-то. Чую, что намудрил где-то с методом save(), но не пойму где. всегда создаётся как и положено 5 объектов CompanyToClientPayment, каждая из них отмечается как оплаченная, но по факту оплачена только одна.

Сохранение нового участника "пирамиды" и проверка, не пора ли начислять родителям деньги. На параметр five_per_period не обращайте внимание:
def pay_to_parent(self, line, five_per_period):
        parent = self.get_parent_of_level(line)

        if parent:
            from payments.models import CompanyToClientPayment
            if line == 1:
                payment_to_parent = CompanyToClientPayment(client=parent,
                                                           total=prices[0]
                                                           use_date=date.today())
                payment_to_parent.save()
            elif line == 2:
                payment_to_parent = CompanyToClientPayment(client=parent,
                                                           total=prices[1]
                                                           use_date=date.today())
                payment_to_parent.save()
            elif line == 3:
                payment_to_parent = CompanyToClientPayment(client=parent,
                                                           total=prices[2],
                                                           use_date=date.today())
                payment_to_parent.save()
            elif line == 4:
                payment_to_parent = CompanyToClientPayment(client=parent,
                                                           total=prices[3],
                                                           use_date=date.today())
                payment_to_parent.save()
            setattr(self, self.rewarded_parents_fields[line - 1], True)

def save(self, newbie=True, *args, **kwargs):
        if newbie:
            if self.get_parent_of_level(1):
                newbie_brothers = self.get_parent_of_level(1).get_relative_level(level=1, newbies_only=True)
                newbie_brothers.append(self)
                if len(newbie_brothers) == 5:
                    for newbie in newbie_brothers:
                        newbie.pay_to_parent(1, five_per_period=True)
                        if newbie.get_parent_of_level(2):
                            newbie.pay_to_parent(2, five_per_period=True)

                if self.get_parent_of_level(3):
                    newbie_brothers = self.get_parent_of_level(3).get_relative_level(level=3, newbies_only=True)
                    newbie_brothers.append(self)
                    if len(newbie_brothers) == 5:
                        for newbie in newbie_brothers:
                            newbie.pay_to_parent(3, five_per_period=False)

                if self.get_parent_of_level(4):
                    newbie_brothers = self.get_parent_of_level(4).get_relative_level(level=4, newbies_only=True)
                    newbie_brothers.append(self)
                    if len(newbie_brothers) == 5:
                        for newbie in newbie_brothers:
                            newbie.pay_to_parent(4, five_per_period=False)
        super(TreeNode, self).save(*args, **kwargs)


Модель выплаты за приглашение
class CompanyToClientPayment(models.Model):

    total = models.PositiveIntegerField(verbose_name='Сумма платежа', blank=False, null=False)
    use_date = models.DateField(verbose_name='Дата платежа', blank=False)
    client = models.ForeignKey(TreeNode, verbose_name='Участник')
    is_paid = models.BooleanField(default=False, verbose_name='Выплачено')

    def save(self, *args, **kwargs):
        if not self.is_paid:
            if self.use_date <= date.today():
                self.pay()
                self.client.save(newbie=False)
        super(CompanyToClientPayment, self).save(*args, **kwargs)

    def pay(self):
        if not self.is_paid:
            self.client.capital += self.total
            self.is_paid = True
  • Вопрос задан
  • 2355 просмотров
Решения вопроса 1
По-моему вы вообще слишком усложняете, в мою голову этот код не помещается. Предлагаю его, для начала, упростить. Вместо всех веток if-ов в первой функции можно написать:

payment_to_parent = CompanyToClientPayment.objects.create(client=parent, total=prices[line - 1], use_date=date.today())


Не очень понимаю, почему у вас save() принимает параметр newbie. Вы переопределяете функцию, которая определена в models.Model (или в MPTTModel). Сигнатуры не должны противоречить.

Есть впечатление, что у вас имеется несколько копий одного и того же объекта участника дерева, вы модифицируете одну из них, а остальные остаются неизменными.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы