Django - Как получить экземпляр self.id при создании нового объекта

Я работаю с двумя классами, когда я сохраняю первый, он автоматически создает другой, поле под названием "transaction" должно быть заполнено self.id.

Но я получаю сообщение об ошибке:

NOT NULL constraint failed: portfolios_portfoliotoken.transaction_id

вот код, который я использую:

PortfolioToken.objects.create(transaction=self.id, portfolio=self.portfolio, date=self.date, total_today_brl=self.total_cost_brl+last.total_today_brl, order_value=self.total_cost_brl)

Более подробную информацию можно посмотреть ниже:



class Transaction(models.Model):
    id = models.AutoField(primary_key=True)
    date =  models.DateField(("Date"), default=date.today)
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, default=1)
    total_cost_brl = models.FloatField(editable=False)
    ...

    def save(self, *args, **kwargs):
        self.share_cost_brl = round(self.share_cost_brl, 2)
        self.total_cost_brl = round(self.shares_amount * self.share_cost_brl, 2)

        ...

        PortfolioToken.objects.create(transaction=self.id, portfolio=self.portfolio, date=self.date, total_today_brl=self.total_cost_brl+last.total_today_brl, order_value=self.total_cost_brl)


        super(Transaction, self).save(*args, **kwargs) 

    
class PortfolioToken(models.Model):
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, default=1)
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
    total_today_brl = models.FloatField()
    order_value = models.FloatField()
    date =  models.DateField(("Date"), default=date.today)
    ...

Вам следует сначала вызвать super().save(*args, **kwargs) для сохранения транзакции, а затем вы можете использовать это для построения PortfolioToken:

class Transaction(models.Model):
    # …

    def save(self, *args, **kwargs):
        # …
        super().save(*args, **kwargs)
        PortfolioToken.objects.create(
            transaction_id=self.id,
            portfolio=self.portfolio,
            date=self.date,
            total_today_brl=self.total_cost_brl+last.total_today_brl,
            order_value=self.total_cost_brl
        )
Вернуться на верх