Остановите обновление запроса 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.