Bring 4 cups water to a boil and add ½ cup Arborio or Carnaroli rice, ¼ teaspoon salt and 2 tablespoons unsalted butter.
Stir to prevent the rice from sticking to the bottom of the pan until it boils again. Lower the heat and simmer for about 20 minutes until the rice grains are very soft and slightly overcooked, with some grains splitting open. Drain it.
Combine the cooked rice, ½ cup sugar and 2 cups milk in a heavy nonreactive saucepan and bring to a boil. Lower the heat and simmer gently, stirring often, until the mixture is thick and creamy, about 20 minutes. Remove from heat and cool until just warm (not hot). Stir it often and chill it if needed to speed up the process. While the rice is cooling, you can blind bake the crust; see Notes below.
Place ½ pound whole-milk ricotta in a large bowl. You can pass it through a sieve or strainer or puree it in a food processor if you want it smooth. I normally don’t, but I especially like the rustic texture. You can also mash the rice before mixing it with the rest of the ingredients.
Mix the ricotta into the rice mixture, followed by 4 large eggs, ½ teaspoon lemon zest, ½ teaspoon orange zest, 1 teaspoon vanilla extract and ¼ teaspoon ground cinnamon. Set aside while preparing the crust. Cover it to prevent dryness.