Django.fun

Stop updating Django query

query = Movimentacao.objects.all()

for m in movimentacoes:
    # this query couldn't be update everytime an item is added to database
    q = query.filter(entrada_saida=m[0], data=m[1], movimentacao=m[2], produto=m[3], instituicao=m[4], quantidade=m[5], preco_unitario=m[6], valor_da_operacao=m[7])
    # check if the object exist
    if q.exists():
        pass
    else:
        # new object is going to be created because it does NOT exist yet
        line = Movimentacao(entrada_saida=m[0], data=m[1], movimentacao=m[2], produto=m[3], instituicao=m[4], quantidade=m[5], preco_unitario=m[6], valor_da_operacao=m[7])
        counter += 1
        line.save()

How can I prevent this 'q' query from being update everytime the looping is repeated? What I'd like is get the original objects from the database.

Build a filter with Q() and pass it into the original query:

query = Movimentacao.objects.all()

filter = None
for m in movimentacoes:
    filter_inst = Q(
        entrada_saida=m[0],
        data=m[1],
        movimentacao=m[2],
        produto=m[3],
        instituicao=m[4],
        quantidade=m[5],
        preco_unitario=m[6],
        valor_da_operacao=m[7])
    if not filter:
        filter = filter_inst
    else:
        filter = filter | filter_inst

if filter:
    query = query.filter(filter)
    
    # turn query into a set:
    existing = { (
        e.entrada_saida, 
        e.data, 
        e.movimentacao, 
        e.produto, 
        e.instituicao, 
        e.quantidade, 
        e.preco_unitario, 
        e.valor_da_operacao
    ) for e in query}
else:
    existing = set()
  


for m in movimentacoes:
    if tuple(m[0:8]) not in existing:
        # new object is going to be created because it does NOT exist yet
        line = Movimentacao(
             entrada_saida=m[0],
             data=m[1],
             movimentacao=m[2],
             produto=m[3],
             instituicao=m[4],
             quantidade=m[5],
             preco_unitario=m[6],
             valor_da_operacao=m[7])
        counter += 1
        line.save()

Q() is one of my favorite pieces of Django ORM.

Tutorials

Константы Python: Улучшение управляемости вашего кода

Современный Python: начинаем проект с pyenv и poetry

Настройка проекта Python — виртуальные среды и управление пакетами

Использование requests в Python — тайм-ауты, повторы, хуки

Понимание декораторов в Python

ProcessPoolExecutor в Python: полное руководство

map() против submit() с ProcessPoolExecutor в Python

Понимание атрибутов, словарей и слотов в Python

Полное руководство по slice в Python

Выпуск Django 4.0

Безопасное развертывание приложения Django с помощью Gunicorn, Nginx и HTTPS

Автоматический повтор невыполненных задач Celery

Django REST Framework и Elasticsearch

Докеризация Django с помощью Postgres, Gunicorn и Nginx

Асинхронные задачи с Django и Celery

Релизы безопасности Django: 3.2.4, 3.1.12 и 2.2.24

Выпуски исправлений ошибок Django: 3.2.3, 3.1.11 и 2.2.23

Эффективное использование сериализаторов Django REST Framework

Выпуски безопасности Django: 3.2.2, 3.1.10 и 2.2.22

Выпущенные релизы безопасности Django: 3.2.1, 3.1.9 и 2.2.21

View all tutorials →