Как использовать обновление в админке 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

Идеально, это должно сработать.

Вернуться на верх