Остановите обновление запроса Django

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()

Как предотвратить обновление этого запроса 'q' при каждом повторении цикла? Я хотел бы получить исходные объекты из базы данных.

Создайте фильтр с Q() и передайте его в исходный запрос:

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() - одна из моих любимых частей Django ORM.

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