Fala Raul, como vai?
Esse comportamento mágico ocorre por conta do ViewSet.
Olha o que a documentação diz: 
Em vez de escrever seus próprios conjuntos de visualizações, você frequentemente desejará usar as classes base existentes que fornecem um conjunto padrão de comportamento. 
Além disso, pontua 2 vantagens de utilizar:
A lógica repetida pode ser combinada em uma única classe. Só precisamos especificar queryset uma vez, e ele será usado em várias visualizações.
Ao usar roteadores, não precisamos mais lidar com a instalação ou especificações da URL.
Em outras palavras, esse id que não passamos como argumento da função, está incluso em nosso queryset da classe ViewSet. Você pode fazer isso na mão? Pode, segue o exemplo sem o uso de Viewset e buscando a pk (chave):
class Receita(APIView): 
    def get_object(self, pk): 
        try:
            return Receita.objects.get(pk=pk) 
        except Receita.DoesNotExist:
            raise Http404
    def get (self, request, pk):
        receita = self.get_object(pk)
        serializer = ReceitaSerializer(receita) 
        return Response (serializer.data)
Fez sentido? Deu para ter uma ideia?
: )