【问题标题】:Django creates but doesn't updates object with get_or_create() methodDjango 使用 get_or_create() 方法创建但不更新对象
【发布时间】:2020-04-17 09:34:35
【问题描述】:

我有一个看起来像这样的模型,我尝试更新字段average_entry_price,但我的问题是尽管创建了对象,但没有从值 7.0 更新到 7074.0。如您所见,created 返回False。

没有错误消息,我认为语法是正确的,因为我首先尝试在字段market 和account 上进行匹配,这似乎工作正常,因为对象在开始时被正确创建,然后我说让 Django 更新剩余字段average_entry_price。 我在这里错过了什么吗?

print(type(market))
print(type(a))
print('new value is', position['price'])
obj, created = Position.objects.get_or_create(
                market=market,
                account=a,
                defaults={
                    'average_entry_price': position['price']
                },
            )
print(obj.average_entry_price)
print(created)

然后它返回:

<class 'marketsdata.models.Market'>
<class 'trading.models.Account'>
new value is 7074.0
7.0
False

models.py

class Position(models.Model):
    account = models.ForeignKey(Account,
                                on_delete=models.CASCADE,
                                related_name='position',
                                null=True
                                )
    market = models.ForeignKey(Market,
                               on_delete=models.CASCADE,
                               related_name='position',
                               null=True
                               )

    average_entry_price = models.DecimalField(max_digits=8,
                                              decimal_places=1,
                                              null=True
                                              )

    class Meta:
        verbose_name_plural = "Positions"

    def __str__(self):
        return str(self.market)

【问题讨论】:

  • 尝试在你的模型中创建一个方法def get_price(self): return self.average_entry_price

标签: django


【解决方案1】:

顾名思义,get_or_create 不会更新

返回 (object, created) 的元组,其中 object 是检索到的或 created 对象和 created 是一个布尔值,指定是否新的 对象已创建。

你可能想要update_or_create

返回 (object, created) 的元组,其中 object 是创建的或 更新的对象和创建的是一个布尔值,指定是否新的 对象已创建。

obj, created = Position.objects.update_or_create(
                market=market,
                account=a,
                defaults={
                    'average_entry_price': position['price']
                },
            )

【讨论】:

  • 天哪,我今晚过得很糟糕,我没有注意到这一点,谢谢!
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多