Категорически не понимаю, зачем вы наращиваете счётчики в цикле, тем более в асинхронной задаче. Правильно это делается так:
page.pageaudio_set.all().update(counter=F('counter ') + 1)
Но если уж очень хочется зачем-то сделать это в асинхронной задаче, то лучше так:
trasactiontaskfunc.delay({
'audio': list(page.pageaudio_set.values_list('id', flat=True)),
'video': list(page.pagevideo_set.values_list('id', flat=True)),
'text': list(page.pagetext_set.values_list('id', flat=True)),
})
def trasactionfunc(totrasaction):
try:
with transaction.atomic():
Audio.objects.filter(id__in=totrasaction['audio']).update(counter=F('counter ') + 1)
Video.objects.filter(id__in=totrasaction['video']).update(counter=F('counter ') + 1)
Text.objects.filter(id__in=totrasaction['text']).update(counter=F('counter ') + 1)
except:
transaction.rollback()
else:
return True
return False
А ещё лучше сделать
Content
не абстрактным и передавать идентификаторы простым списком.
P.S. Явно откатывать транзакция не нужно, контекстный менеджер делает это за вас.