Использование результата F для получения ключа

У меня есть диктант типа {product_id: count}.

Например cart_items = {1: 150}. Эта диктанта представляет корзину покупателя.

У меня также есть модель продукта с полем count. Оно представляет остатки на складе.

Я хочу получить продукты, которые находятся в dict, и обновить их количество в соответствии со значениями в dict.

Я получаю такие продукты: products = Product.objects.filter(id__in=cart_items)

И я хочу обновить количество следующим образом: products.update(count=dict.get(F("id"))

Но это не работает.

Thx!

You can do this, but it is very bad idea. Typically you make JOINs in the database, since databases are optimized for this. You can however work with a Case-When expression [Django-doc] for this:

from django.db.models import Case, Value, When

products.update(
    count=Case(*[When(pk=k, then=Value(v)) for k, v in my_dict.items()])
)

Таким образом, my_dict будет "разматываться" в (вероятно) длинную последовательность CASE WHEN … THEN …. Однако это приведет к тому, что линейный поиск замедлит процесс обновления.

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