Как использовать обновление в админке django с помощью пользовательской функции
Это мой первый вопрос в Stack Overflow. Я пытаюсь сделать действие администратора для обновления цены актива. Сначала он устанавливает last_update_date на today/now и я хочу установить last_price на текущую рыночную цену. Последняя часть не работает, так как не обновляется.
Admin.py
@admin.action(description='Update asset price')
def update_price(modeladmin, request, queryset):
queryset.update(last_update_date = timezone.now())
for q in queryset:
q.last_price = get_close_price(q.ticker) #does not change anything
class AssetAdmin(admin.ModelAdmin):
actions = [update_price]
admin.site.register(Asset, AssetAdmin)
Models.py
class Asset(models.Model):
ticker = models.CharField(
verbose_name="Ticker",
max_length=5,
unique=True,
)
last_price = models.DecimalField(
verbose_name="Last Price",
max_digits=8,
decimal_places=2,
validators=[MinValueValidator(0)]
)
last_update_date = models.DateTimeField(
verbose_name="Last update date"
)
class Meta:
ordering = ['ticker']
def __str__(self) -> str:
return self.ticker
Пользовательская функция (из API Alpha Advantage)
def get_close_price(SYMBOL):
params["symbol"] = SYMBOL
close_price = get(URL, params).json()
close_price = close_price["Global Quote"]["05. price"]
return close_price #returns an int
Поскольку вы обновляете поле last_update_date
, используя update()
на queryset в строке:
queryset.update(last_update_date = timezone.now())
Это обновление значения для каждого поля в данном наборе запросов. Но что касается поля last_price
, оно не обновляется, потому что вы не вызываете save()
, как указал @KlauseD. Что вам нужно добавить, так это:
for q in queryset:
q.last_price = get_close_price(q.ticker)
q.save() # to save the updated price
Идеально, это должно сработать.