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)