You can use the MCMT (multi-controlled multi-target gate) class to do something like this. To execute CCZ gate, I can do it as follow:
from qiskit.circuit.library import MCMT
qr= QuantumRegister(3)
circ=QuantumCircuit(qr)
circ = MCMT('cz',2,1)
print(circ)
q_0: ─■─
│
q_1: ─■─
│
q_2: ─■─
And if you want to see how the circuit would look using more elementary gates, you can decompose it:
print(circ.decompose().decompose())
┌───┐ ┌─────────────┐ »
q_0: ──────────────────────────────────────────┤ X ├────┤ U(0,0,-π/4) ├──■──»
┌────────────┐ └─┬─┘ └─────────────┘ │ »
q_1: ┤ U(0,0,π/4) ├──■───────────────────■───────■───────────────────────┼──»
├────────────┤┌─┴─┐┌─────────────┐┌─┴─┐┌──────────┐ ┌────────────┐┌─┴─┐»
q_2: ┤ U(0,0,π/4) ├┤ X ├┤ U(0,0,-π/4) ├┤ X ├┤ U(0,0,0) ├─┤ U(0,0,π/4) ├┤ X ├»
└────────────┘└───┘└─────────────┘└───┘└──────────┘ └────────────┘└───┘»
« ┌───┐ ┌────────────┐ »
«q_0: ────────────────■───────┤ X ├─────┤ U(0,0,π/4) ├──■───────────────────■──»
« │ └─┬─┘ └────────────┘ │ │ »
«q_1: ────────────────┼─────────■───────────────────────┼───────────────────┼──»
« ┌────────────┐┌─┴─┐┌─────────────┐┌────────────┐┌─┴─┐┌─────────────┐┌─┴─┐»
«q_2: ┤ U(0,0,π/4) ├┤ X ├┤ U(0,-π/2,0) ├┤ U(0,0,π/4) ├┤ X ├┤ U(0,0,-π/4) ├┤ X ├»
« └────────────┘└───┘└─────────────┘└────────────┘└───┘└─────────────┘└───┘»
«
«q_0: ────────────
«
«q_1: ────────────
« ┌──────────┐
«q_2: ┤ U(0,0,0) ├
« └──────────┘