Django update_or_create с использованием объектов форсайта ключей

В моем приложении есть две модели, PortfolioAsset и Transction.

Я пытаюсь использовать update_or_create в транзакции, чтобы найти, существует ли объект PortfolioAsset с выбранными параметрами. Если он существует, то обновить, если нет, то создать.

Но я получаю эту ошибку:

Невозможно присвоить "(<PortfolioAsset: объект PortfolioAsset (11)>, False)": "Transaction.portfolio_asset" должен быть экземпляром "PortfolioAsset".

Это существующий объект, который я хотел бы обновить в данном примере.

PortfolioAsset

class PortfolioAsset(models.Model):
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, default=1)
    asset = models.ForeignKey(Asset, on_delete=models.CASCADE)
    shares_amount = models.DecimalField(max_digits=18, decimal_places=0) 

    def validate_unique(self, *args, **kwargs):
        super().validate_unique(*args, **kwargs)
        if self.__class__.objects.\
                filter(portfolio=self.portfolio, asset=self.asset).\
                exists():
            raise ValidationError(
                message='This asset already exists in this portfolio.',
                code='unique_together',
            )

и Транзакции:

class Transaction(models.Model):
    OrderChoices = (
        ('Buy', 'Buy'),
        ('Sell', 'Sell'),
    )
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, default=1)
    asset = models.ForeignKey(Asset, on_delete=models.CASCADE, default=1)
    portfolio_asset = models.ForeignKey(PortfolioAsset, on_delete=models.CASCADE, editable=False)
    shares_amount = models.DecimalField(max_digits=18, decimal_places=0)
    order = models.CharField(max_length = 8, choices = OrderChoices)        

    def save(self, *args, **kwargs):
        self.portfolio_asset = PortfolioAsset.objects.update_or_create(portfolio=self.portfolio, asset=self.asset)
        if self.order == 'Buy':
            self.portfolio_asset.shares_amount += self.shares_amount
        if self.order == 'Sell':
            self.portfolio_asset.shares_amount -= self.shares_amount
        self.portfolio_asset.save()
        super(Transaction, self).save(*args, **kwargs) 

Что я делаю неправильно? Спасибо

update_or_create...[Django-doc] возвращает кортеж: объект и флаг, указывающий, был ли он создан.

Поэтому сначала нужно захватить объект следующим образом:

self.portfolio_asset, created = PortfolioAsset.objects.update_or_create(portfolio=self.portfolio, asset=self.asset)
Вернуться на верх