Django: преобразовать все значения двух столбцов в абсолютные значения - PullRequest
1 голос
/ 15 апреля 2020

Допустим, у меня есть модель продукта с двумя столбцами, price, sold. Я хочу преобразовать все значения в абсолютные значения для этих двух столбцов и сохранить их. В настоящее время я делаю это

for obj in Product.objects.all():
        obj.price = abs(obj.price)
        obj.sold = abs(obj.sold)
Product.objects.bulk_update(all_obj, ['price', 'sold'])

Хотя это работает, но это занимает слишком много времени для таблицы, где мы можем иметь полмиллиона записей. Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Начиная с , вы можете использовать функцию Abs [Django -doc] :

from django.db.models.functions import <b>Abs</b>

Product.objects.update(price=<b>Abs(</b>'price'<b>)</b>, sold=<b>Abs(</b>'sold'<b>)</b>)

Это будет выполнять обработку на уровне базы данных, а не на уровне Django / Python, поэтому он создаст запрос, который выглядит следующим образом:

UPDATE product
SET price=ABS(price), sold=ABS(sold)
1 голос
/ 15 апреля 2020

Вы используете F выражения для получения полей и установки значения abs для всех строк:

from django.db.models import F
Product.objects.all().update(price = abs(F('price')), sold = abs(F('sold'))

См. Документы: https://docs.djangoproject.com/en/3.0/topics/db/queries/#filters -can-reference-fields-on- -модель

1 голос
/ 15 апреля 2020

должен иметь возможность просто использовать выражение F, если вы хотите работать с каждой записью:

from django.db.models import F

Product.objects.update(price=abs(F('price')), sold=abs(F('sold')))

другой ответ, использующий Abs, более эффективен, но оставит это здесь как F более универсальный инструмент для ссылки на поля модели в запросах и обновлениях, который очень полезен при разработке с Django.

...